hdu 4565 So Easy!(矩阵+快速幂)
题目大意:就是给出a,b,n,m;让你求s(n);
解题思路:因为n很可能很大,所以一步一步的乘肯定会超时,我建议看代码之前,先看一下快速幂和矩阵快速幂,这样看起来就比较容易,这里我直接贴别人的推导,应该很容易懂。
看到这里你应该明白了大概吧!好吧现在继续看我的代码吧!!
AC代码:
#include<stdio.h> long long c[2][2],d[2]; int main() { long long a,b,n,m,x,y,p,q; while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&m)!=EOF) { c[0][0]=2*a; c[0][1]=b-a*a; c[1][0]=1; c[1][1]=0; d[0]=2*a; d[1]=2; while(n)//矩阵快速幂的实现过程 { if(n&1) { x=(c[0][0]*d[0]+c[0][1]*d[1])%m; y=(c[1][0]*d[0]+c[1][1]*d[1])%m; d[0]=x; d[1]=y; } n=n/2; x=(c[0][0]*c[0][0]+c[0][1]*c[1][0])%m; y=(c[0][0]*c[0][1]+c[0][1]*c[1][1])%m; p=(c[1][0]*c[0][0]+c[1][1]*c[1][0])%m; q=(c[1][0]*c[0][1]+c[1][1]*c[1][1])%m; c[0][0]=x; c[0][1]=y; c[1][0]=p; c[1][1]=q; } printf("%I64d\n",(d[1]+m)%m); } return 0; }