Educational Codeforces Round 7 F. The Sum of the k-th Powers 拉格朗日插值法

F. The Sum of the k-th Powers

题目连接:

http://www.codeforces.com/contest/622/problem/F

Description

There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees.

Find the value of the sum modulo 109 + 7 (so you should find the remainder after dividing the answer by the value 109 + 7).

Input

The only line contains two integers n, k (1 ≤ n ≤ 109, 0 ≤ k ≤ 106).

Output

Print the only integer a — the remainder after dividing the value of the sum by the value 109 + 7.

Sample Input

4 1

Sample Output

10

Hint

题意

让你计算1k+2k+....+n^k

题解:

拉格朗日插值法

答案等于$${P}{x} = \sum^{k+2}({P}{i}\prod^{k+2}\frac{n-j}{i-j})$$

最后的答案就等于P(n)

我们预处理(n-j)的阶乘,再预处理下面的阶乘就好了

对于这样,对于每一个i,我们都能够O(logn)来计算了(logn拿来求逆元)

代码

#include<bits/stdc++.h>
using namespace std;

const int mod = 1e9+7;
const int maxn = 1e6+7;
long long quickpow(long long  m,long long n,long long k)//返回m^n%k
{
    long long b = 1;
    while (n > 0)
    {
          if (n & 1)
             b = (b*m)%k;
          n = n >> 1 ;
          m = (m*m)%k;
    }
    return b;
}
long long p[maxn];
long long fac[maxn];
int n,k;
int main()
{
    fac[0]=1;
    for(int i=1;i<maxn;i++)
        fac[i]=(fac[i-1]*i)%mod;
    scanf("%d%d",&n,&k);
    p[0]=0;
    for(int i=1;i<=k+2;i++)
        p[i]=(p[i-1]+quickpow(i,k,mod))%mod;
    if(n<=k+2)
    {
        printf("%d\n",p[n]);
        return 0;
    }
    long long cur = 1;
    for(int i=1;i<=k+2;i++)
        cur=(cur*(n-i))%mod;
    long long ans = 0;
    for(int i=1;i<=k+2;i++)
    {
        long long tmp = quickpow(fac[k+2-i]%mod*fac[i-1]%mod,mod-2,mod);
        long long tmp2 = quickpow(n-i,mod-2,mod);
        if((k+2-i)%2)tmp=-tmp;
        ans =(ans + p[i]*cur%mod*tmp%mod*tmp2)%mod;
    }
    cout<<ans<<endl;
}
posted @ 2016-02-22 14:55  qscqesze  阅读(861)  评论(3编辑  收藏  举报