题目大意就是给定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 #include2 #include 3 #include 4 #include 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 else44 {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 #"< <<": ";49 cout< <