版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82177173
矩阵快速幂+快速乘法
不难构造出矩阵
|a c| |x0 0| |1 0| |1 0|
然后就是在矩阵乘法的时候,需要用到快速乘法防止爆longlong,快速乘法类似于快速幂,自己意会
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
struct mtix
{
lli x[2][2];
mtix(){memset(x,0,sizeof(x));}
}f,g;
lli n,p,a,c,x0,mod;
inline lli gscf(lli x,lli y)
{
lli ans=0;
for (;y;x=(x<<1)%p,y>>=1)
if (y&1) ans=(ans+x)%p;
return ans;
}
inline mtix mul(mtix A,mtix B)
{
mtix C;
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
C.x[i][j]=(C.x[i][j]+gscf(A.x[i][k],B.x[k][j]))%p;
return C;
}
inline mtix mpow(mtix b,lli y)
{
mtix ans;ans.x[0][0]=ans.x[1][1]=1;
for (;y;b=mul(b,b),y>>=1)
if (y&1) ans=mul(ans,b);
return mul(ans,g);
}
signed main()
{
cin>>p>>a>>c>>x0>>n>>mod;
f.x[0][0]=a;f.x[0][1]=c;f.x[1][1]=1;
g.x[0][0]=x0;g.x[1][0]=1;
mtix ans=mpow(f,n);
cout<<ans.x[0][0]%mod;
return 0;
}