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{i}^{k+2}({P}{i}\prod{j=1,j\neq i}^{k+2}\frac{n-j}{i-j})$$

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

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

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

代码

#include
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