斐波那契数列

  1. F[0]=0;

    F[1]=1;

    F[n]=F[n-1]+F[n-2], for n>1

    给出n (0<=n<=10000) 和 m (0<m<10000);求斐波那契数列第n项mod m的值(因为太大了);

  2. #include<stdio.h>
  3. #include<string.h>
  4. // 矩阵快速幂
  5. void xx(longlong a[][3],longlong b[][3],longlong m){
  6. longlong tmp[3][3];
  7. tmp[1][1]= tmp[1][2]= tmp[2][1]= tmp[2][2]=0;
  8. for(int i =1; i <=2; i++){
  9. for(int j =1; j <=2; j++){
  10. for(int k =1; k <=2; k++){
  11. tmp[i][j]+=(a[i][k]%m*b[k][j]%m)%m;
  12. }
  13. }
  14. }
  15. for(int i =1; i <=2; i++)
  16. for(int j =1; j <=2; j++) a[i][j]= tmp[i][j]%m;
  17. }
  18. int main(){
  19. // ans初值是单位矩阵
  20. longlong T, ans[3][3], r[3][3], n, m;
  21. r[1][2]= r[2][1]= r[2][2]= ans[1][1]= ans[2][2]=1;
  22. r[1][1]= ans[1][2]= ans[2][1]=0;
  23. scanf("%lld%lld",&n,&m);
  24. if(!n){printf("%lld\n",0% m);return0;}
  25. if(n ==1){printf("%lld\n",1% m);return0;}
  26. n--;
  27. while(n){
  28. if(n &1) xx(ans, r, m);
  29. n >>=1;
  30. xx(r, r, m);
  31. }
  32. printf("%lld\n", ans[2][2]% m);
  33. return0;
  34. }
posted on 2014-04-18 22:29  左手代码右手诗  阅读(648)  评论(0编辑  收藏  举报