标签:计算 fine continue div 乘法 main name 一个 org
题面:https://www.luogu.org/problem/P2044
矩阵乘法裸题。
关键在于base和ans矩阵。
经过计算待定系数可以得到。
ans = { (x0,1) , (0,0) }
base = { (a,0) , (c,1) }
如代码所示。
然后就可以快乐的矩阵乘法了!
但是还有一个事。
大数据不要忘了龟速乘!
不然会爆炸成50分。
代码如下:
#include<bits/stdc++.h> #define ll long long using namespace std; ll mod,a,c,xx,n,g; struct node{ ll m[5][5]; }ans,base; inline ll qm(ll x,ll y){ ll res=0; while(y){ if(y&1) res=(res+x)%mod; x=(x+x)%mod; y>>=1; } return res; } inline node mul(node x,node y){ node res; memset(res.m,0,sizeof(res.m)); for(int i=1;i<=2;i++) for(int k=1;k<=2;k++){ if(!x.m[i][k]) continue; for(int j=1;j<=2;j++){ res.m[i][j]+=qm(x.m[i][k],y.m[k][j]); res.m[i][j]%=mod; } } return res; } inline void qp(ll p){ while(p){ if(p&1) ans=mul(ans,base); base=mul(base,base); p>>=1; } } int main() { scanf("%lld%lld%lld%lld%lld%lld",&mod,&a,&c,&xx,&n,&g); ans.m[1][1]=xx;ans.m[1][2]=1; base.m[1][1]=a;base.m[2][1]=c;base.m[2][2]=1; qp(n); printf("%lld\n",ans.m[1][1]%g); system("pause"); return 0; }
标签:计算 fine continue div 乘法 main name 一个 org
原文地址:https://www.cnblogs.com/ChrisKKK/p/11455408.html