题解:
这题真的很麻烦,有多种情况要讨论
公式不会编辑,将就着看一下吧
我的sigma如果上下界没注明,那就默认是1和n的
代码有点烦,还是不要看的好,最多拿来对拍一下
注意:ex_gcd中a,b不能是负数,要处理一下
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
typedef long long ll;
ll p,q,r,n,P,Q,tmp,k,K,y,t,T,ans;
void ex_gcd(ll a,ll b,ll &x,ll &y){
if (a<0) a=(a%M+M)%M;
if (b<0) b=(b%M+M)%M;
if (!b){
x=1;y=0;
return;
}
ex_gcd(b,a%b,y,x);
y-=a/b*x;
}
ll pm(ll x,ll y){
ll z=1;
for (;y;y>>=1,x=x*x%M)
if (y&1) z=z*x%M;
return z;
}
int main(){
scanf("%lld%lld%lld%lld",&p,&q,&r,&n);
if (p==1){
if (q==1) ans=n*(n+1)/2%M*3*r%M;
else{
ex_gcd(q,M,Q,y);
T=n*Q%M;
ex_gcd(q-1,M,Q,y);
k=pm(q,n)-1;
if (k<0) k+=M;
k=k*Q%M;
k=(k-T)%M;
ans=k*q%M*Q%M*3*r%M;
}
}else{
if (p==q) t=n+1;
else{
ex_gcd(q,M,Q,y);
tmp=pm(p*Q%M,n+1)-1;
if (tmp<0) tmp+=M;
k=(p*Q-1)%M;
ex_gcd(k,M,K,y);
t=tmp*K%M;
}
t=t*pm(q,n)%M;
if (q==1) k=n+1;
else{
k=q-1;
ex_gcd(k,M,K,y);
T=pm(q,n+1)-1;
if (T<0) T+=M;
k=T*K%M;
}
t=(t-k)%M;
ex_gcd(p-1,M,P,y);
ans=3*r*P%M*t%M;
}
printf("%lld",(ans+M)%M);
}