2016 Asia Jakarta Regional Contest J - Super Sum UVALive - 7720 【快速幂+逆元】

J-Super Sum

题目大意就是给定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  

 

posted @ 2017-08-01 08:59  ╰追憶似水年華ぃ╮  阅读(270)  评论(0编辑  收藏  举报