zoukankan      html  css  js  c++  java
  • 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 eq 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
    ",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;
    }
  • 相关阅读:
    非递归的中序遍历(inorder)树 leetcode 94
    基于二叉树的抢劫问题 leetcode337
    查询二叉树的公共父结点 leetcode 236
    链表的无锁操作 (JAVA)
    kexec 内核快速启动流程分析
    最近几天严重营养不良。。。
    Better Me
    《大四上寒假总结》--3.10
    《计算机网络》学习总结
    记录
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5207132.html
Copyright © 2011-2022 走看看