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

官方推导公式:

0k1,k2,kmn1j<m(kjkj+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}}

=0k1k2kmn1j<m(kjkj+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}}

=km=0nkm1=0kmk1=0k21j<m(kjkj+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 }

=km=0n{(km1km)km1=0km{(km2km1)k1=0k2(k1k2)}}

 =\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 }=km=0n{(km1km)km1=0km{(km2km1)k1=0k2(k1k2)}} =\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 }

=km=0n{(km1km)km1=0km{(km2km1)k2=0k3(k2k3)2k2}} =\sum_{k_{m}=0}^{n}m^{k_{m}}

=km=0nmkm =\frac{m^{n+1} - 1}{m - 1}

=m1mn+11

 

自己找的规律是求: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  阅读(364)  评论(0)    收藏  举报