记录编号 360009 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2012]随机数生成器 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 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;
}