记录编号 |
360009 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOI 2012]随机数生成器 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.011 s |
提交时间 |
2016-12-26 07:34:36 |
内存使用 |
0.30 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long p;
long long mul(long long a,long long b){
a%=p;b%=p;
return ((long long)(a*b-(long long)((long double)a*b/p+1e-3)*p)+p)%p;
}
struct MA{
long long a[3][3];
MA(){memset(a,0,sizeof(a));}
void init(long long k){for(int i=1;i<=2;i++)a[i][i]=k;}
MA operator*(const MA &b)const{
MA c;
for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)for(int k=1;k<=2;k++)
c.a[i][j]=(c.a[i][j]+mul(a[i][k],b.a[k][j]))%p;
return c;
}
MA &operator*=(const MA &b){return *this=*this*b;}
long long *operator[](const int &x){return a[x];}
}A,B;
MA qpow(MA,long long);
long long n,g;
int main(){
freopen("randoma.in","r",stdin);
freopen("randoma.out","w",stdout);
scanf("%lld%lld%lld%lld%lld%lld",&p,&B[1][1],&B[2][1],&A[1][1],&n,&g);
A[1][2]=B[2][2]=1;
A*=qpow(B,n);
printf("%lld",A[1][1]%g);
return 0;
}
MA qpow(MA a,long long b){
MA ans;
ans.init(1);
for(;b;b>>=1,a*=a)if(b&1)ans*=a;
return ans;
}