码农奇迹
专注、专业、无畏的前行
Problem      :http://acm.hrbeu.edu.cn/index.php?act=problem&proid=5037
Code        :
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[701][701];
 5     for(int j=2;j<=700;j++)
 6     {
 7         a[0][j]=1;
 8         a[1][j]=1;
 9         for(int i=2;i<=700;i++)
10             a[i][j]=(a[i-1][j]+a[i-2][j])%j;
11     }
12     int n;
13     while(scanf("%d",&n)!=EOF)
14     {
15         while(n--)
16         {
17             int m;
18             scanf("%d",&m);
19             int count=0;
20             for(int i=2;i<=m;i++)
21                 if(a[m][i]==0)
22                     count++;
23             printf("%d\n",count);
24         }
25     }
26     return 0;
27 }
28 

本题的解法非常精妙的运用a[i][j]=(a[i-1][j]+a[i-2][j])%j来保存Fibonacci余数,避免了大数运算及因Fibonacci过大而造成超时或溢出的问题。
posted on 2009-08-11 17:08  @编程浪子@  阅读(242)  评论(0编辑  收藏  举报