题目大意:Xn+1 = (aXn + c) mod m ,求Xn mod g
题解:模板题,随手构造一发矩阵
加了特技快速乘
注意矩乘的时候mod m,最后再mod g
我的收获:233
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define Rep(i,x) for(int i=0;i<x;i++)
#define N 2
ll a,m,n,g,c,x0;
ll mul(ll x,ll y)
{
ll tmp=(x*y-(ll)((long double)x/m*y+1e-8)*m);
return tmp<0?tmp+m:tmp;
}
struct Matrix{
int x,y;ll v[N][N];
ll *operator [] (int x){return v[x];}
Matrix(int _x,int _y,int w=0){
x=_x,y=_y;
Rep(i,N) Rep(j,N) v[i][j]=(i==j)?w:0;
}
};
Matrix operator * (Matrix a,Matrix b){
Matrix c(a.x,b.y);
Rep(i,a.x) Rep(j,b.y) Rep(k,a.y) c[i][j]=(c[i][j]+mul(a[i][k],b[k][j]))%m;
return c;
}
Matrix operator ^ (Matrix a,ll b){
Matrix c(a.x,a.y,1);
for(;b;b>>=1,a=a*a)
if(b&1) c=c*a;
return c;
}
Matrix F(1,N),T(N,N);
void work()
{
T=T^n;F=F*T;
printf("%lld\n",F[0][0]%g);
}
void init()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
F[0][0]=x0;F[0][1]=1;
T[0][0]=a;T[1][0]=c;T[0][1]=0;T[1][1]=1;
}
int main()
{
init();
work();
return 0;
}