很简单的一道题啊qwq,构造矩阵然后乱搞搞就A了。(讲道理我一开始两个unsigned long long相乘写错了qwq,矩阵就是这样的:
|a 1| |Xn 0| |Xn+1 0|
|0 1| |c 0| |c 0|
#include"stdio.h" #include"iostream" using namespace std; typedef unsigned long long ll; ll mod,a,c,x0,n,Mod; const ll maxint=1<<31; inline ll mul(ll a,ll b){ ll c=0,aa=0,d=a; while(d) c=c*10+d%10,d/=10; while(a) aa=(aa*10+(c%10*b))%mod,c/=10,a/=10; return aa; } struct matrix{ ll m[2][2]; matrix(){} matrix(ll c0,ll c1,ll c2,ll c3) { m[0][0]=c0,m[0][1]=c1,m[1][0]=c2,m[1][1]=c3;} matrix friend operator * (const matrix&a,const matrix&b){ matrix c ( (mul(a.m[0][0],b.m[0][0])+mul(a.m[0][1],b.m[1][0]))%mod, (mul(a.m[0][0],b.m[0][1])+mul(a.m[0][1],b.m[1][1]))%mod, (mul(a.m[1][0],b.m[0][0])+mul(a.m[1][1],b.m[1][0]))%mod, (mul(a.m[1][0],b.m[0][1])+mul(a.m[1][1],b.m[1][1]))%mod ); return c; } }; int main(){ cin>>mod>>a>>c>>x0>>n>>Mod; matrix k(1,0,0,1),ans(x0,0,c,0),po(a,1,0,1); while (n){ if(n%2)k=k*po; po=po*po; n>>=1; } ans=k*ans; cout<<ans.m[0][0]%Mod<<endl; return 0; }