目录
显示
题目链接
https://www.luogu.org/problem/P2044
题解
我们先来算一下生成的 \(x_n\) 究竟是多少。(为了简单起见,下面把 \(x_0\) 简记为 \(x\))
- \(x_1 = (ax+c) \bmod m\)
- \(x_2 = (ax_1+c) \bmod m = (a^{2}x+ac+c) \bmod m\)
- \(x_3 = (ax_2+c) \bmod m = (a^{3}x+a^{2}c+ac+c) \bmod m\)
- \(\ldots\)
- \(x_n = (a^{n}x+a^{n-1}c+ \ldots + ac+c) \bmod m\)
整个式子被分为两部分:\(a^{n}x\) 可以用快速幂解决。
而 \(a^{n-1}c+ \ldots + ac+c\) 这个等比数列也可以递归解决。
然而由于中间结果溢出的原因,我们需要使用龟速乘法来对 long long 取模。
#include <iostream>
using namespace std;
long long m,a,c,x,n,g;
long long smul(long long x,long long y)
{
long long ans=0;
while(y)
{
if(y&1)ans=(ans+x)%m;
x=(x+x)%m;
y>>=1;
}
return ans;
}
long long fpow(long long x,long long y)
{
long long ans=1;
while(y)
{
if(y&1)ans=smul(ans,x);
x=smul(x,x);
y>>=1;
}
return ans;
}
long long calc(long long n)
{
if(n==1)return c;
long long res=calc(n/2);
res=(res+smul(res,fpow(a,n/2)))%m;
if(n&1)res=(res+smul(fpow(a,n-1),c))%m;
return res;
}
int main()
{
cin>>m>>a>>c>>x>>n>>g;
long long ans=smul(fpow(a,n),x);
ans=(ans+calc(n))%m;
cout<<ans%g<<endl;
return 0;
}