一个快速幂+逆元取模
有一点点前缀和的思想
一定要注意d=0的时候等比数列的求和公式是不同的
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll pp=1000000007;
ll quickmod(ll ans,ll x){
ll a=1;
while(x){
if(x%2){
a=(ans%pp*a%pp)%pp;
}
ans=(ans%pp*ans%pp)%pp;
x/=2;
}
return a;
}
int main(){
int w=0;scanf("%d",&w);
ll d=0;scanf("%lld",&d);
ll ans=1;
for(int i=1;i<=w;i++){
ll p,a;
scanf("%lld %lld",&p,&a);
ll dd=quickmod(p,d);
ll up=dd*quickmod(dd,a)-dd;
if(d==0){
up=(dd%pp*a%pp)%pp;
}
ll down=quickmod(dd-1,pp-2);
ll temp=(up%pp*down%pp)%pp;
if(d==0){
ans=((ans%pp)+(ans%pp)*(a%pp))%pp;
}else{
ans=((ans%pp)+(ans%pp)*(temp%pp)%pp)%pp;
}
}
printf("%lld",ans);
return 0;
}
]