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;
    }
  • 相关阅读:
    Emacs for OIer 的一些配置
    CF1336E Chiori and Doll Picking 【线性代数,组合计数】
    CF605E Intergalaxy Trips 【贪心,动态规划,期望】
    Luogu6329 【模板】点分树 | 震波
    [SDOI2014]数表
    [BZOJ4403]序列统计
    [BZOJ5099]Pionek
    SP1812 LCS2
    SA & SAM
    [HAOI2016]找相同字符
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5207132.html
Copyright © 2011-2022 走看看