首页 > 其他分享 >51NOD 1258 自然数幂和

51NOD 1258 自然数幂和

时间:2023-09-19 20:01:00浏览次数:38  
标签:limits 51NOD 多项式 sum 自然数 ret int 1258 mod

题目链接

description

\(T\) 次询问,每次给定 \(n,k\),求 \(\sum\limits_{i=1}^n i^k\) 模 1e9+7.

\(n\leq 10^{18},k\leq 5\times 10^4\)

solution

可以拉插用什么多项式

考虑将 \(n\) 带入 \(f(x)=\sum\limits_{i=1}^x i^k\)。可以证明,\(f(x)\) 是一个 \(k+1\) 次多项式。

一种感性的理解方式是 \(i^k\) 积分后是个 \(k+1\) 次函数

于是我们可以通过拉格朗日插值法构造出这个多项式在 \(n\) 处的取值。

我们容易线性筛求出 \(f(x)\) 在 \(1,2,\dots,k,k+1,k+2\) 处的点值,根据 \(n+1\) 个点确定一个 \(n\) 次多项式,我们可以通过这些点值构造出这个多项式。

设 \(t=k+2\),\(s_p=\sum\limits_{i=1}^p i^k\),对于 \(1\leq p\leq t,p\in \mathbb{Z}\),构造函数 \(g_p(x)=s_p\prod\limits_{i=1,i\neq p}^t \dfrac{(x-i)}{(p-i)}\)。不难验证,\(\forall x\in[1,t]\cap\mathbb{Z},x\neq p\) 有 \(g_p(x)=0\) 且 \(g_p(p)=s_p\)。

于是可以得出 \(f(x)=\sum\limits_{p=1}^t g_p(x)=\sum\limits_{p=1}^t s_p \prod\limits_{i=1,i\neq p}^t \dfrac{(x-i)}{(p-i)}\)。

于是 \(f(n)=\sum\limits_{p=1}^t s_p \prod\limits_{i=1,i\neq p}^t \dfrac{(n-i)}{(p-i)}\)

线性筛出 \(s_p\),预处理阶乘以及 \(n-i\) 的前缀后缀积,即可做到严格线性。

时间复杂度 \(O(Tk)\)

code

#include<bits/stdc++.h>

using namespace std;

const int N=(1<<18)+10,mod=1e9+7;

int f[N],n,k,m;
bitset<N> st;

int ksm(int a,int b){
  int ret=1;
  while(b){
    if(b&1) ret=ret*1ll*a%mod;
    a=a*1ll*a%mod;
    b>>=1;
  }
  return ret;
}

vector<int> primes;

int pre[N],sfx[N],jc[N];

void solve(){
  long long nn;
  cin>>nn;
  nn%=mod;
  cin>>k;
  n=nn;

  primes.clear();
  st.reset();
  m=k+2;
  f[1]=1;
  for(int i=2; i<=m; i++){
    if(!st[i]){
      f[i]=ksm(i,k);
      primes.emplace_back(i);
    }
    for(auto j:primes){
      if(i*j>m) break;
      st[i*j]=1;
      f[i*j]=f[i]*1ll*f[j]%mod;
      if(i%j==0){
        break;
      }
    }
  }
  for(int i=2; i<=m; i++){
    f[i]=(f[i-1]+f[i])%mod;
  }

  jc[0]=pre[0]=sfx[m+1]=1;
  for(int i=1; i<=m; i++){
    jc[i]=jc[i-1]*1ll*i%mod;
    pre[i]=pre[i-1]*1ll*(n-i)%mod;
  }

  for(int i=m; i; i--){
    sfx[i]=sfx[i+1]*1ll*(n-i)%mod;
    jc[i]=i==m?ksm(jc[i],mod-2):jc[i+1]*1ll*(i+1)%mod;
  }

  int ans=0;
  for(int i=1; i<=m; i++){
    int t=sfx[i+1]*1ll*pre[i-1]%mod*jc[i-1]%mod*jc[m-i]%mod;
    if((m-i)&1) t=mod-t;
    ans=(ans+t*1ll*f[i]%mod)%mod;
  }

  cout<<ans<<'\n';
}

int main(){

  int T;
  cin>>T;
  while(T--) solve();

  return 0;
}

标签:limits,51NOD,多项式,sum,自然数,ret,int,1258,mod
From: https://www.cnblogs.com/FreshOrange/p/17715658.html

相关文章

  • 自然数的拆分
    #include<bits/stdc++.h>usingnamespacestd;inta[1001],n;voiddfs(intp,intc,ints){if(s==n){cout<<n<<"="<<a[0];for(inti=1;i<c;i++)cout<<'+'<<a[i];......
  • 51Nod 试题泛做1
    A-排船的问题很显然,这个数据范围用二分来找这个最长的最短是OK的,然后我们就判断一下二分到的东西,用一个贪心,就是尽可能将每一个往左边放,但不能与船重叠,也不能超过我们二分到的最长的绳的长度,因为要尽可能给后面留出空间,让后面的绳的长度不超过我们二分到的长度。然后如果最后极......
  • 51nod-1605 棋盘问题
    原题链接1605 棋盘问题基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的。亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色......
  • 51nod-1086 背包问题(多重背包)
    原题链接1086 背包问题 V2基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注Input第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)第2 - N......
  • 51nod-1280 前缀后缀集合
    原题链接1280 前缀后缀集合题目来源: Codility基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注一个数组包含N个正整数,其中有些是重复的。一个前缀后缀集是满足这样条件的下标对(P,S),0<=P,S......
  • 51nod-1523 非回文
    原题链接1523 非回文题目来源: CodeForces基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题一个字符串是非回文的,当且仅当,他只由前p个小写字母构成,而且他不包含长度大于等于2的回文子串。给出长度为n的非回文串s。请找出字典序......
  • 51nod-1460 连接小岛
    原题链接1460 连接小岛题目来源: CodeForces基准时间限制:1.5 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注li+1  对于所有的 1≤i≤n-1。现在要将相邻的小岛用桥连接起来。现在有一条桥的长度是a,第i个......
  • 51nod-1434 区间LCM
    原题链接1434 区间LCM题目来源: TopCoder基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注例如,LCM(2)=2,LCM(4,6)=12,LCM(1,2,3,4,5)=60。现在给定一个整数N(1<=N<=1000000),需要找到......
  • 51nod-1624 取余最长路
    原题链接1624 取余最长路基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。有一天,她被下了恶......
  • 51nod-1191 消灭兔子
    原题链接1191 消灭兔子题目来源: 2013腾讯马拉松赛第三场基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭......