「BZOJ4126 」国王奇遇记
「BZOJ4126 」国王奇遇记
题意:
求
。
这类形如 的题目都可以用一种套路解决( 表示一个多项式)
直接上结论:
设 ,则存在一个度为 的多项式 满足
证明直接看我这篇博客:https://www.cnblogs.com/nightsky05/p/16200886.html
易知答案为:
根据那篇博客里的内容易知:
推出这条式子之后能用 以 表达出所有的 。
根据高阶公差的知识我们有(也在那篇博客里):
得到一个关于 的方程,解得 后依次求得 直接插值求得 。然后就可以得到答案了。
复杂度 ( 是逆元的)。
然后我为了方便是用 插值的。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 5e5+5;
const int MOD = 1e9+7;
ll n,m,K[MAXN],B[MAXN],g[MAXN],I[MAXN],fac[MAXN],df[MAXN],inv[MAXN];
ll qpw(ll x,ll b)
{
ll r=1;
for(;b;b>>=1,x=x*x%MOD) if(b&1) r=r*x%MOD;
return r;
}
ll C(int n,int m){return fac[n]*inv[m]%MOD*inv[n-m]%MOD;}
ll lag()
{
if(n+1<=m+1) return g[n+1];
ll P=1;
for(int i=1;i<=m+1;++i) P=P*(n+1-i)%MOD;
for(int i=1;i<=m+1;++i) I[i]=qpw(n+1-i,MOD-2);
ll res=0;
for(int i=1;i<=m+1;++i)
res=(res+g[i]*df[m+1-i]%MOD*inv[i-1]%MOD*P%MOD*I[i]%MOD)%MOD;
return res;
}
int main()
{
scanf("%lld %lld",&n,&m);
if(m==1){printf("%lld\n",1ll*(n+1)*n/2);}
fac[0]=1;df[0]=1;
for(int i=1;i<=m+1;++i) fac[i]=fac[i-1]*i%MOD,df[i]=df[i-1]*(MOD-i)%MOD;
df[m+1]=qpw(df[m+1],MOD-2);
for(int i=m;i>=0;--i) df[i]=df[i+1]*(MOD-i-1)%MOD;
inv[m+1]=qpw(fac[m+1],MOD-2);
for(int i=m;i>=0;--i) inv[i]=inv[i+1]*(i+1)%MOD;
K[0]=1;B[0]=0;
for(int i=1;i<=m+1;++i)
{
ll f=qpw(i-1,m);
K[i]=K[i-1]*qpw(m,MOD-2)%MOD;B[i]=(B[i-1]+f)%MOD*qpw(m,MOD-2)%MOD;
}
ll k=0,b=0;
for(int i=0;i<=m+1;++i)
{
ll t=((i&1)==((m+1)&1))?1:MOD-1;
k=(k+t*C(m+1,i)%MOD*K[i]%MOD)%MOD;
b=(b+t*C(m+1,i)%MOD*B[i]%MOD)%MOD;
}
g[0]=(MOD-b)*qpw(k,MOD-2)%MOD;
for(int i=1;i<=m+1;++i)
g[i]=(K[i]*g[0]%MOD+B[i])%MOD;
ll gn=lag(),Ans=(gn*qpw(m,n+1)%MOD-g[0]+MOD)%MOD;
printf("%lld\n",Ans);
return 0;
}
路漫漫其修远兮,吾将上下而求索。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】