CF622F The Sum of the k-th Powers 题解

原式为 \(k+1\) 次多项式,所以需要 \(k+2\) 个点确定。

然后转化,前缀和。

\[\begin{equation} n=k+2\\ \end{equation} \]

\[\begin{equation} f(x)=\sum\limits_{i=0}^{n} y_i \prod\limits_{j=0,j \ne i}^{n} \frac{x-x_j}{x_i-x_j} \end{equation} \]

\[\begin{equation} x_0=0,x_1=1 \dots x_n=k+2\\y_i=\prod \limits_{j=0}^{i} j^k \end{equation} \]

\[\begin{equation} \sum_{j=0}^{i-1} \frac{x-x_j}{x_i-x_j}+\sum_{j=i+1}^{n} \frac{x-x_j}{x_i-x_j} \end{equation} \]

\[\begin{equation} \sum_{j=0}^{i-1} \frac{x-x_j}{x_i-x_j} =\frac{x}{i} \times \frac{x-1}{i-1} \times \dots \times \frac{x-i+1}{1} \end{equation} \]

\[\begin{equation} \sum_{j=i+1}^{n} \frac{x-x_j}{x_i-x_j}=\frac{x-i-1}{-1} \times \frac{x-i-2}{-2} \times \dots \frac{x-n}{-(n-i)} \end{equation} \]

#include<bits/stdc++.h> 
#define int long long 
#define x first 
#define y second 
#define il inline 
#define debug() puts("-----") 
using namespace std; 
typedef pair<int,int> pii; 
il int read(){ 
	int x=0,f=1; char ch=getchar(); 
	while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } 
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 
	return x*f; 
} 
const int N=1e6+10; 
const int Mod=1e9+7; 
int n,k;  
int y[N]; 
int ans=0; 
int fac[N]; 
int f1[N],f2[N]; 
il int qmi(int x,int k){ 
	int res=1; 
	while(k){ 
		if(k&1) res=res*x%Mod; 
		x=x*x%Mod; k>>=1; 
	} return res; 
} 
signed main(){ 
	int x=read(); 
	k=read(),n=k+2; 
	f1[0]=f2[n+1]=fac[0]=1; 
	for(int i=1;i<=n;i++){ 
		fac[i]=fac[i-1]*i%Mod; 
		f1[i]=f1[i-1]*(x-i+1)%Mod; 
		y[i]=(y[i-1]+qmi(i,k))%Mod; 
	} for(int i=n;i>=1;i--) f2[i]=f2[i+1]*(x-i)%Mod; 
	for(int i=1;i<=n;i++){ 
//		int s1=f1[i-1]*qmi(fac[i-1],Mod-2)%Mod; 
//		int s2=f2[i+1]*qmi(fac[n-i],Mod-2)%Mod; 
//		if((n-i)&1) s2=-s2; 
		int w1=f1[i]*f2[i+1]%Mod; 
		int w2=fac[i]*fac[n-i]%Mod; 
		if((n-i)&1) w2=-w2; 
		ans=(ans+y[i]*w1%Mod*qmi(w2,Mod-2)%Mod)%Mod; 
	} printf("%lld\n",(ans+Mod)%Mod); 
	return 0; 
} 
posted @ 2024-03-07 13:36  Celestial_cyan  阅读(30)  评论(0)    收藏  举报