首页 > 代码库 > 51nod1228 序列求和(自然数幂和)

51nod1228 序列求和(自然数幂和)

与UVA766 Sum of powers类似,见http://www.cnblogs.com/IMGavin/p/5948824.html

由于结果对MOD取模,使用逆元

 

#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#include<cmath>#include<utility>using namespace std;typedef long long LL;const int N = 2016, INF = 0x3F3F3F3F, MOD = 1000000007;LL bo[N];LL cm[N][N], inv[N];void init(){    inv[1] = 1;    for(int i = 2; i < N; i++){    	inv[i] = (MOD - MOD / i ) * inv[MOD % i] % MOD;    }    memset(cm, 0, sizeof(cm));    cm[0][0] = 1;    for(int i = 1; i < N; i++){        cm[i][0] = 1;        for(int j = 1; j <= i; j++){            cm[i][j] = (cm[i - 1][j - 1] + cm[i - 1][j]) % MOD;        }    }    bo[0] = 1;    for(int i = 1; i < N; i++){        bo[i] = 0;        for(int j = 0; j < i; j++){        	bo[i] += cm[i + 1][j] * bo[j] % MOD;        	bo[i] %= MOD;        }        bo[i] = (-bo[i] * inv[i + 1] % MOD + MOD) % MOD;    }    bo[1] = inv[2];}LL PowMod(LL a,LL b,LL MOD){//快速幂    LL ret=1;    while(b){        if(b&1) ret=(ret*a)%MOD;        a=(a*a)%MOD;        b>>=1;    }    return ret;}LL solve(LL n, LL m){	LL ans = 0;	for(LL k = 0; k <= m; k++){		ans += (cm[m + 1][k] * bo[k] % MOD) * PowMod(n % MOD, m + 1 - k, MOD) % MOD;		ans %= MOD;	}	ans = ans * inv[m + 1] % MOD;	return ans;}int main(){    init();    int t;    cin >> t;    while(t--){        LL n, k;        scanf("%I64d %I64d", &n, &k);        printf("%I64d\n", solve(n, k));    }    return 0;}

  

51nod1228 序列求和(自然数幂和)