찾다

 >  Q&A  >  본문

c++ - acm小题之关于大整数对1000000007取模

#include <stdio.h>
#include <math.h>
int main ()
{int a,i=1,n,T;
scanf("%d",&T);
n=T;
int q[T+1]; 
while(T--)
{scanf("%d",&a);
q[i++]=(long)((1/sqrt(5))*((pow(((1+sqrt(5))/2),a+2)-pow(((1-sqrt(5))/2),a+2))-1))%1000000007;
 
 }
for(i=1;i<=n;i++) 
 printf("%d\n",q[i]);}

运行结果:

此题我算出Sn了,可是在取模这里一直有问题。。。求解计算过程中怎么防止溢出

ringa_leeringa_lee2807일 전1168

모든 응답(4)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:33:03

    每做一次加法和乘法,就取一次模

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:33:03

    用递推算,不要用通项公式。

    m = 1000000007
    S(n)=(F(1)+F(2)+...+F(n)) % m
        =(F(1)%m + F(2)%m + ... + F(n)%m) % m
    
    F(n) = F(n-2) + F(n-1)
    F(n)%m = (F(n-2) + F(n-1)) % m
           = (F(n-2)%m + F(n-1)%m) % m

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 13:33:03

    感谢两位大神啦ლ(╹ε╹ლ) 算出来了

    회신하다
    0
  • 阿神

    阿神2017-04-17 13:33:03

    (a+b)%c==(a%c)+(b%c)
    乘法同理

    经评论指正应是:(a+b)%c==((a%c)+(b%c))%c

    회신하다
    0
  • 취소회신하다