【CODEVS】1281 Xn数列
【算法】矩阵快速幂
【题解】T*A(n-1)=A(n)矩阵如下:
a 1 * x(n-1) 0 = xn 0
0 1 c 0 c 0
防止溢出可以用类似快速幂的快速乘。
#include<cstdio> #include<algorithm> #define ll long long using namespace std; ll MOD,A,c,x0,n,g,a[2][2],b[2][2],t[2][2]; ll mull(ll x,ll y) { ll ans=0; while(y>0) { if(y&1)ans=(ans+x)%MOD; x=(x<<1)%MOD;//x+x y>>=1; } return ans; } void mul(ll a[2][2],ll b[2][2],ll ans[2][2]) { for(int i=0;i<2;i++) for(int j=0;j<2;j++) { t[i][j]=0; for(int k=0;k<2;k++) t[i][j]=(t[i][j]+mull(a[i][k],b[k][j]))%MOD; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) ans[i][j]=t[i][j]; } int main() { scanf("%lld%lld%lld%lld%lld%lld",&MOD,&A,&c,&x0,&n,&g); a[0][0]=A,a[0][1]=a[1][1]=1,a[1][0]=0; b[0][0]=x0,b[1][0]=c,b[0][1]=b[1][1]=0; while(n>0) { if(n&1)mul(a,b,b); n>>=1; mul(a,a,a); } printf("%lld",b[0][0]%g); return 0; }