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

题意

让你计算1^k+2^k+....+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<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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值