首页 > 代码库 > 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 序列求和(自然数幂和)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。