裸的矩阵乘法…………
用2*1的矩阵记录当前结果(0,0记录Xi,1,0恒为1表示常数项)
快速乘……懒得写随便找了个O1快速乘_(:зゝ∠)_
听说是玄学还是别这么乱搞好了2333
#include<bits/stdc++.h>
using namespace std; long long x0,a,c,n,m,g;
long long mult(long long u,long long v){
return (u*v-(long long)((long double)u*v/m)*m+m)%m;
}
struct matrix{
long long d[2][2];
long long x,y;
matrix():x(0),y(0){memset(d,0,sizeof d);}
matrix(long long x,long long y):x(x),y(y){memset(d,0,sizeof d);}
matrix(long long xx){
x=y=xx;
memset(d,0,sizeof d);
}
inline matrix operator * (const matrix & ano) {
matrix TMP=matrix();
TMP.x=x,TMP.y=ano.y;
for(long long i=0;i<x;++i)
for(long long j=0;j<y;++j)
for(long long k=0;k<ano.y;++k)
TMP.d[i][k]+=mult(d[i][j],ano.d[j][k]),TMP.d[i][k]%=m;
return TMP;
}
inline matrix pow(const long long &cf){
matrix RTN=matrix(),TMP=*this;
RTN.x=x,RTN.y=y;
for(long long i=0;i<x;++i) RTN.d[i][i]=1;
for(register long long i=cf;i;i>>=1,TMP=TMP*TMP)
if(i&1)
RTN=RTN*TMP;
return RTN;
}
}A,B;
int main(){
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
A=matrix(2,1);
A.d[0][0]=x0,A.d[1][0]=1;
B=matrix(2,2);
B.d[0][0]=a,B.d[0][1]=c,B.d[1][1]=1;
matrix kk=B.pow(n)*A;
// matrix kk=B;
// for(long long i=1;i<=n;++i)
// A=kk*A,printf("%lld\n",A.d[1][1]);
printf("%lld",kk.d[0][0]%g);
return 0;
}