连续同指数幂的和

问题:求和:1^k+2^k+...+n^k

例题:

https://codeforces.com/contest/622/problem/F

代码:

复制代码
#include<bits/stdc++.h>

#define fore(x,y,z) for(LL x=(y);x<=(z);x++)
#define forn(x,y,z) for(LL x=(y);x<(z);x++)
#define rofe(x,y,z) for(LL x=(y);x>=(z);x--)
#define pub push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
LL MOD = 1e9+7;
LL n,k;
LL p[1000010];
LL fac[1000010];
LL inv[1000010];
LL QuickPow(LL base, LL exp)
{
    LL res = 1;
    while (exp)
    {
        if (exp & 1)
        {
            res = res * base % MOD;
        }
        base *= base;
        base %= MOD;
        exp >>= 1;
    }
    return res;
}
void YD()
{
    cin >> n >> k;
    if (n <= k + 2)
    {
        LL res = 0;
        for (int i = 1; i <= n; i++)
        {
            res += QuickPow(i, k);
            res %= MOD;
        }
        cout << res << endl;
    }
    else
    {
        for (int i = 1; i <= k + 5; i++)
        {
            p[i] = p[i - 1] + QuickPow(i, k);
            p[i] %= MOD;
        }
        fac[0] = 1;
        for (int i = 1; i <= k + 5; i++)
        {
            fac[i] = fac[i - 1] * i % MOD;
        }
        inv[k + 5] = QuickPow(fac[k + 5], MOD - 2);
        for (int i = k + 4; i >= 0; i--)
        {
            inv[i] = inv[i + 1] * (i + 1) % MOD;
        }
        LL c = 1;
        for (int i = 1; i <= k + 2; i++)
        {
            c = c * (n - i) % MOD;
        }
        LL res = 0;
        LL s=1;
        if (k % 2) s = -1;
        for (int i = 1; i <= k + 2; i++)
        {
            s *= -1;
            res += p[i] * c % MOD * QuickPow(n - i, MOD - 2) % MOD * inv[i - 1] % MOD * inv[k + 2 - i] % MOD * s % MOD;
            res = (res + MOD)% MOD;
        }
        cout << res << endl;
    }

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    //cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code
复制代码

 

1、当n较小而k较大时,用快速幂求解

2、当k较小而n较大时

拉格朗日插值法:

参考题解:

https://blog.csdn.net/cheng__yu_/article/details/107489125

https://blog.csdn.net/baidu_35643793/article/details/75270875

https://blog.csdn.net/sdfzchy/article/details/78307534?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase

复杂度klogk

posted @   80k  阅读(200)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示