记录编号 242682 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2012]随机数生成器 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2016-03-28 09:04:21 内存使用 0.32 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
LL N,M;
inline LL quickmul(LL x,LL y,LL MOD)
{
	x%=MOD;y%=MOD;
	LL d=(LL)((long double)x*y/MOD+0.5);
	LL re=(x*y)-d*MOD;
	if(re<0) re+=MOD;
	re%=MOD;
	return re;
}
class miku
{
public:
	int n,m;
	LL s[3][3];
	miku()
	{
		n=m=0;
		memset(s,0,sizeof(s));
	}
	void make(int x)
	{
		n=m=x;
		for(int i=0;i<n;i++) s[i][i]=1;
	}
	void print()
	{
		cout<<n<<" "<<m<<endl;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++) cout<<s[i][j]<<" ";
			cout<<endl;
		}
	}
}D,A;
miku operator *(miku a,miku b)
{
	miku c;
	c.n=a.n;c.m=b.m;
	for(int i=0;i<c.n;i++)
	{
		for(int j=0;j<c.m;j++)
		{
			for(int k=0;k<a.m;k++)
			{
				c.s[i][j]+=quickmul(a.s[i][k],b.s[k][j],M);
				c.s[i][j]%=M;
			}
		}
	}
	return c;
}
miku quickpow(miku a,LL t)
{
	miku re;
	re.make(2);
	while(t)
	{
		if(t&1) re=re*a;
		t>>=1;a=a*a;
	}
	return re;
}
LL g;
void read()
{
	D.n=D.m=2;
	scanf("%lld",&M);
	scanf("%lld%lld",&D.s[0][0],&D.s[0][1]);D.s[1][1]=1;
	scanf("%lld",&A.s[0][0]);
	scanf("%lld",&N);
	scanf("%lld",&g);
	A.n=2;A.m=1;A.s[1][0]=1;
}
void work()
{
	miku ans=quickpow(D,N);
	ans=ans*A;
	ans.s[0][0]%=g;
	printf("%lld",ans.s[0][0]);
}
int main()
{
	freopen("randoma.in","r",stdin);
	freopen("randoma.out","w",stdout);
	read();
	work();
	return 0;
}