hdu 5793 A Boring Question (快速幂+逆元)(规律题)

官方推导公式:

∑​0≤k​1​​,k​2​​,⋯k​m​​≤n​​∏​1≤j<m​​(​k​j​​​k​j+1​​​​) =\sum_{0\leq k_{1}\leq k_{2}\leq\cdots \leq k_{m}\leq n}\prod_{1\leq j< m}\binom{k_{j+1}}{k_{j}}

=∑​0≤k​1​​≤k​2​​≤⋯≤k​m​​≤n​​∏​1≤j<m​​(​k​j​​​k​j+1​​​​) =\sum_{k_{m}=0}^{n}\sum_{k_{m-1}=0}^{k_{m}}\cdots \sum_{k_{1}=0}^{k_{2}}\prod_{1\leq j< m}\binom{k_{j+1}}{k_{j}}

=∑​k​m​​=0​n​​∑​k​m−1​​=0​k​m​​​​⋯∑​k​1​​=0​k​2​​​​∏​1≤j<m​​(​k​j​​​k​j+1​​​​) =\sum_{k_{m}=0}^{n}\left { \binom{k_{m}}{k_{m-1}} \sum_{k_{m-1}=0}^{k_{m}} \left { \binom{k_{m-1}}{k_{m-2}} \cdots \sum_{k_{1}=0}^{k_{2}}\binom{k_{2}}{k_{1}} \right } \right }

=∑​k​m​​=0​n​​{(​k​m−1​​​k​m​​​​)∑​k​m−1​​=0​k​m​​​​{(​k​m−2​​​k​m−1​​​​)⋯∑​k​1​​=0​k​2​​​​(​k​1​​​k​2​​​​)}}

 =\sum_{k_{m}=0}^{n}\left { \binom{k_{m}}{k_{m-1}} \sum_{k_{m-1}=0}^{k_{m}} \left { \binom{k_{m-1}}{k_{m-2}} \cdots \sum_{k_{1}=0}^{k_{2}}\binom{k_{2}}{k_{1}} \right } \right }=∑​k​m​​=0​n​​{(​k​m−1​​​k​m​​​​)∑​k​m−1​​=0​k​m​​​​{(​k​m−2​​​k​m−1​​​​)⋯∑​k​1​​=0​k​2​​​​(​k​1​​​k​2​​​​)}} =\sum_{k_{m}=0}^{n}\left { \binom{k_{m}}{k_{m-1}} \sum_{k_{m-1}=0}^{k_{m}} \left { \binom{k_{m-1}}{k_{m-2}} \cdots \sum_{k_{2}=0}^{k_{3}}\binom{k_{3}}{k_{2}}2^{k_{2}} \right } \right }

=∑​k​m​​=0​n​​{(​k​m−1​​​k​m​​​​)∑​k​m−1​​=0​k​m​​​​{(​k​m−2​​​k​m−1​​​​)⋯∑​k​2​​=0​k​3​​​​(​k​2​​​k​3​​​​)2​k​2​​​​}} =\sum_{k_{m}=0}^{n}m^{k_{m}}

=∑​k​m​​=0​n​​m​k​m​​​​ =\frac{m^{n+1} - 1}{m - 1}

=​m−1​​m​n+1​​−1​​

 

自己找的规律是求:ans=m^0+m^1+m^2+...+m^n,也就是等比数列的前n+1项和

/*by*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL N=2010;
const LL mod=1000000007;
const LL INF=0x3f3f3f;
LL quickpow(LL m, LL n)
{
    LL b = 1;
    while(n > 0) {
        if(n & 1)
            b = (b * m) % mod;
        n = n >> 1 ;
        m = (m * m) % mod;
    }
    return b;
}
int main()
{
    int T;
    cin>>T;
    while(T--) {
        LL n,m;
        scanf("%lld%lld",&n,&m);
        LL ans=0;
        ans=quickpow(m,n+1)-1;
        ans=ans*quickpow(m-1,mod-2)%mod;/*求逆元*/
        printf("%lld\n",ans%mod);
    }
    return 0;
}

 

posted @ 2016-08-05 09:35  byonlym  阅读(407)  评论(0)    收藏  举报