标签:res class ret str -- mod lin bit 多项式
看大部分题解发现说是\(\sum_{i=1}^ni^k\)是一个\(k+1\)次多项式,可是我实在是看不出来,所以接下来证明一下。
对于这样一个数列,我们称之为常数数列。
如果\(\{a\}\)的\(p\)阶差数列是一个非\(0\)的常数数列,那么就称数列\(\{a\}\)为\(p\)阶等差数列。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 1e6 + 10;
ll pre[maxn], suf[maxn], fac[maxn];
ll n, k, ans;
ll qmi(ll a, ll b)
{
ll res = 1; res %= mod;
while(b)
{
if(b&1) res = res*a%mod;
a = (a*a)%mod;
b >>= 1;
} return res % mod;
}
void init()
{
pre[0] = suf[k+3] = fac[0] = 1;
for(int i = 1; i <= k+2; i++)
pre[i] = pre[i-1]*(n-i) % mod;
for(int i = k+2; i >= 1; i--)
suf[i] = suf[i+1]*(n-i) % mod;
for(int i = 1; i <= k+2; i++)
fac[i] = fac[i-1]*i % mod;
}
void Lagrange()
{
ll y = 0;
for(int i = 1; i <= k+2; i++)
{
y = (y + qmi(i, k)) % mod;
ll a = pre[i-1]*suf[i+1] % mod;
ll b = fac[i-1]*((k-i)&1 ? -1ll : 1ll)*fac[k+2-i] % mod;
ans = (ans + y*a%mod * qmi(b, mod-2)) % mod;
} cout << (ans + mod) % mod << endl;
}
int main()
{
scanf("%lld%lld", &n, &k);
init(); Lagrange();
return 0;
}
CF622F:The Sum of the k-th Powers
标签:res class ret str -- mod lin bit 多项式
原文地址:https://www.cnblogs.com/zxytxdy/p/12147208.html