一个快速幂+逆元取模

有一点点前缀和的思想

一定要注意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;
}

]