写出来也被它的速度吓了一跳,程序最坑的地方应该就是防止溢出了。
#include <stdio.h> #include <stdlib.h> #define MOD (19999997) struct matrix { unsigned long long a; unsigned long long b; //{a,b} unsigned long long c; //{c,d} unsigned long long d; }; struct matrix mul_matrix(struct matrix a,struct matrix b) //return a*b { struct matrix temp; temp.a=(a.a*b.a+a.b*b.c)%MOD; temp.b=(a.c*b.a+a.d*b.b)%MOD; temp.c=(a.a*b.b+a.b*b.d)%MOD; temp.d=(a.c*b.b+a.d*b.d)%MOD; return temp; } struct matrix pow_matrix(struct matrix ori) { return mul_matrix(ori,ori); } int main(int argc, char*argv[]) { unsigned long max=atoi(argv[1]); struct matrix ms[32]; //pow(M,n) int i=1; ms[0].a=0; ms[0].b=1; ms[0].c=1; ms[0].d=1; for(i=1;i<32;i++) ms[i]=pow_matrix(ms[i-1]); struct matrix answer; answer.a=1;answer.b=0;answer.c=0;answer.d=1;// E matrix i=0; while(max) { if(max&0x01) answer=mul_matrix(answer,ms[i]); i++; max>>=1; } printf("%lld\n",(answer.d)%MOD); return 0; }
时间: 2024-10-17 16:51:56