思路:推一下公式可以知道其实就是a^n*x+a^(n-1)*b+a^(n-2)*b+....b,就是一个等比数列求和嘛,注意特判1,可是因为范围太大,所以就要用到模乘法以及逆元。
a^(mod) % mod = a
a^(mod-1) % mod = 1
a^(mod-2) * a %mod = 1
所以a^(mod-2)是a的逆元,这样就可以将等比数列求和里面的除给变成乘法了
#include<bits\stdc++.h>
using namespace std;
#define LL long long
const LL mod = 1e9+7;
LL quickpow(LL m,LL n,LL k)
{
LL b = 1;
while(n>0)
{
if(n&1)
b = (b*m)%k;
n>>=1;
m = (m*m)%k;
}
return b;
}
int main()
{
LL a,b,n,x;
cin >> a >> b >> n >> x;
if(a==1)
{
cout << (x+(n%mod*b))%mod << endl;
}
else
{
LL ans = (quickpow(a,n,mod)-1+mod)%mod;
ans = ans *quickpow(a-1,mod-2,mod)%mod*b%mod;
ans = (ans+quickpow(a,n,mod)*x+mod)%mod;
cout << ans << endl;
}
}