题意:
fx=ax+b
g0=x
gn=f(gn-1)+b=a*(gn-1)+b
求gn
思路:
通过递推关系可以得到
a=1时 gn=x+b*n
否则 gn=a^n*x+b*(1-a^n)/(1-a)
取余的运算对加减法和乘法满足分配率,但对除法不满足,如果式子中存在除法并且要对式子取余,需要将除法用乘法逆元转化为乘法
求 a / b %c
如果c是素数,则原式= a * b^c-2 % c
如果c不是素数,需要用扩展欧几里得求逆元
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
ll fpow(ll a,ll b)
{
ll ans=1;
ll tmp=(a%mod);
while(b)
{
if(b&1)
ans=(ans*tmp)%mod;
b/=2;
tmp=(tmp*tmp)%mod;
}
return (ans%mod);
}
int main()
{
ll a,b,n,x;
cin>>a>>b>>n>>x;
if(n==0)
{
printf("%lld\n",x%mod);
return 0;
}
if(a==1)
{
printf("%lld\n",(x%mod+(b%mod*(n%mod))%mod)%mod);
return 0;
}
ll d=fpow(a,n);
ll ans=(d*x%mod+b%mod*(1-d)%mod*fpow(1-a,mod-2)%mod)%mod;
printf("%lld\n",ans);
}