题解
题目的意思很明确,
看看数据范围就觉得有点神奇,
先看前面7个数据,这个就直接模拟就好了。
在看8-14,此时的模数比较小,就知道应该是找循环节。
然后就只剩下最后的了,
有个特殊条件,看看怎样利用,
利用一下费马小定理,就愉快地解决了这题。
code
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll n,a,b,c,m,x,t;
int p[1000003];
ll ksm(ll x,ll y,ll mo)
{
ll s=1;x=x%mo;
for(;y;y>>=1,x=x*x%mo)
if(y&1)s=s*x%mo;
return s;
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&x,&a,&b,&c,&n,&m);
x=x%m;
if(4*a*c==b*b-2*b)
{
t=ksm(2,n,m-1)-1;
if(t<0)t+m-1;
printf("%lld",(ksm(a,t,m)*ksm(x+b/a/2,t+1,m)%m-b/2/a+m)%m);
return 0;
}
if(n>m)
{
for(register int i=1;i<=n;i++)
{
x=((a*x%m*x%m+b*x%m)%m+c)%m;
if(p[x])
{
n=n-p[x];
n=n%(i-p[x]);
break;
}else p[x]=i;
}
}
for(register int i=1;i<=n;i++)
x=((a*x%m*x%m+b*x%m)%m+c)%m;
printf("%lld",x);
return 0;
}