题目大意就是给定N个三元组<a,b,c>求Σ(a1^k1*a2^k2*...*ai^ki*..an^kn)(bi<=ki<=ci)
唉。其实题目本身不难的,怪我不知道当时怎么想的。。。本来观察式子很容易能得出结论:
比如<5,2,3>,<2,1,4>,<3,2,2>这组:
5^2*2^1*3^2+5^2*2^2*3^2+5^2*2^3*3^2+5^2*2^4*^32=5^2*(2^1+2^2+2^3+2^4)*3^2;
5^3*2^1*3^2+5^3*2^2*3^2+5^3*2^3*3^2+5^3*2^4*^32=5^3*(2^1+2^2+2^3+2^4)*3^2;
=(5^2+5^3)*(2^1+2^2+2^3+2^4)*3^2;
很明显啊!就行对应三元组的等比数列相乘啊!
用组合的角度看也是啊,那几个式子不就相当于最后这个式子拆开再相加吗!
到这里基本就已经解决问题了。。。。。。。。。唯一需要注意的就是等比数列相乘时有除法,求模的时候要把分母转化成它的逆元。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 const int mod=1e9+7; 8 9 10 ll qpow(ll a,ll b)//快速幂 11 { 12 ll r=1; 13 while(b) 14 { 15 if(b&1) r=r*a%mod; 16 b>>=1; 17 a=a*a%mod; 18 } 19 return r; 20 } 21 22 ll inv(ll a)//费马小定理求逆元 23 { 24 return qpow(a,mod-2); 25 } 26 27 int main() 28 { 29 int T; 30 cin>>T; 31 for (int cas=1;cas<=T;cas++) 32 { 33 int n; 34 cin>>n; 35 ll ans=1; 36 for (int i=1;i<=n;i++) 37 { 38 ll a,b,c; 39 cin>>a>>b>>c; 40 if(a==1){//公比为1单独处理 41 ans=(ans%mod*(c-b+1)%mod)%mod; 42 } 43 else 44 { 45 ans=(ans%mod*(qpow(a,b)%mod*(qpow(a,c-b+1)-1)%mod*inv(a-1)%mod)%mod)%mod; 46 } 47 } 48 cout<<"Case #"<<cas<<": "; 49 cout<<ans<<endl; 50 } 51 return 0; 52 } 53