题面传送门
我是真服了,猜结论这么牛逼。我tm应该猜个二次函数就写哪这个多废话。
首先看这个形式XX+Y感觉非常不爽,然后看样例发现所有能合并出来的序列的概率式一样的。
所以就猜概率是一样的,进一步得出概率是1CAin。
证明就考虑每次操作是下面一定是从n一直减一到1,上面两边分别从Ai和n−Ai减到1,乘起来就是这个概率。
然后你手摸一下样例发现一次函数塞进去后这个期望也是一个一次函数。
然后你xjb乱拆系数范德蒙特卷积是可以化简证明出来的。做题的时候的过程卸载下面。
bi=min(Ak,i)∑j=1Cj−1i−1CAk−jn−ij+min(n,Ak+i)∑j=Ak+1Cj−Ak−1i−1Cn−jn−ij
=min(Ak,i)∑j=1(j−1)Cj−1i−1CAk−jn−i+Cj−1i−1CAk−jn−i+min(n,Ak+i)∑j=Ak+1Cj−Ak−1i−1Cn−jn−i(j−Ak−1)+(Ak+1)Cj−Ak−1i−1Cn−jn−i
=CAk−1n−1+(Ak+1)CAk+1n−1+min(Ak,i)∑j=1(i−1)Cj−2i−2CAk−jn−i+min(n,Ak+i)∑j=Ak+1Cj−Ak−2i−2Cn−jn−i(i−1)
=CAk−1n−1+(Ak+1)CAkn−1+(i−1)(CAk−2n−2+CAkn−2)
P=Akn+(n−Ak)(Ak+1)n+(i−1)(Ak(Ak−1)n(n−1)+(n−Ak)(n−Ak−1)n(n−1))
然后进一步猜一猜二次函数塞进去也是二次函数。按照上面的方法一样推就好了。
ci=min(Ak,i)∑j=1Cj−1i−1CAk−jn−ij2+min(n,Ak+i)∑j=Ak+1Cj−Ak−1i−1Cn−jn−ij2
=min(Ak,i)∑j=1Cj−1i−1CAk−jn−i((j−1)(j−2)+3(j−1)+1)+min(n,Ak+i)∑j=Ak+1Cj−Ak−1i−1Cn−jn−i((n−j)(n−j−1)−(2n−1)(n−j)+n2)
=CAk−1n−1+3(i−1)CAk−2n−2+(i−1)(i−2)CAk−3n−3+(n−i)(n−i−1)CAkn−3−(n−i)(2n−1)CAkn−2+n2CAkn−1
=Akn+3Ak(Ak−1)(i−1)n(n−1)+(i−1)(i−2)Ak(Ak−1)(Ak−2)n(n−1)(n−2)+n(n−Ak)−(n−i)(2n−1)(n−Ak)(n−Ak−1)n(n−1)+(n−i)(n−i−1)(n−Ak)(n−Ak−1)(n−Ak−2)n(n−1)(n−2)
Ans.c=Akn−3Ak(Ak−1)n(n−1)+2Ak(Ak−1)(Ak−2)n(n−1)(n−2)+n(n−Ak)−(2n−1)(n−Ak)(n−Ak−1)n−1+(n−Ak)(n−Ak−1)(n−Ak−2)n−2
Ans.b=3Ak(Ak−1)n(n−1)−3Ak(Ak−1)(Ak−2)n(n−1)(n−2)+(2n−1)(n−Ak)(n−Ak−1)n(n−1)−(2n−1)(n−Ak)(n−Ak−1)(n−Ak−2)n(n−1)(n−2)
Ans.a=Ak(Ak−1)(Ak−2)n(n−1)(n−2)+(n−Ak)(n−Ak−1)(n−Ak−2)n(n−1)(n−2)
然后直接模拟即可,时间复杂度O(m+q)
code:
#include<bits/stdc++.h>
#define I inline
#define ll long long
#define db double
#define lb long db
#define N (500000+5)
#define M ((N<<1)+5)
#define K (700+5)
#define mod 998244353
#define Mod (mod-1)
#define eps (1e-5)
#define ull unsigned ll
#define it iterator
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((k+1)*(x)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;
int n,m,op;ll I1,I2,I3,x;
I ll mpow(ll x,int y=mod-2){ll Ans=1;while(y) y&1&&(Ans=Ans*x%mod),y>>=1,x=x*x%mod;return Ans;}
struct Node{ll a,b,c;Node operator +(const Node &B)const{return (Node){a+B.a,b+B.b,c+B.c};};}Ans;
I Node A3(ll c,ll x){return (Node){0,0,c};}I Node A2(ll b,ll x){Node C;C.a=C.b=C.c=0;C.b=(x*(x-1)+(n-x)*(n-x-1))%mod*I2%mod*I1%mod*b%mod;C.c=(x+(n-x)*(x+1))%mod*b%mod*I1%mod-C.b;return C;}
I Node A1(ll a,ll x){return (Node){(x*(x-1)%mod*(x-2)+(n-x)*(n-x-1)%mod*(n-x-2))%mod*I1%mod*I2%mod*I3%mod*a%mod,((3*x*(x-1)+(2*n-1)*(n-x)%mod*(n-x-1))-(3*x*(x-1)%mod*(x-2)+(2*n-1)*(n-x)%mod*(n-x-1)%mod*(n-x-2))%mod*I3)%mod*I1%mod*I2%mod*a%mod,(((2*(x-2)*I3-3)%mod*(x-1)%mod*I2%mod+1)*x%mod*I1%mod+n*(n-x)%mod-(2*n-1)*(n-x)%mod*(n-x-1)%mod*I2%mod+(n-x)*(n-x-1)%mod*(n-x-2)%mod*I3%mod)*a%mod};}
int main(){
freopen("1.in","r",stdin);
scanf("%d%d%d",&n,&m,&op);if(op==1) Ans=(Node){0,1,0};else Ans=(Node){1,0,0};I1=mpow(n);I2=mpow(n-1);I3=mpow(n-2);
while(m--)scanf("%lld",&x),Ans=A3(Ans.c,x)+A2(Ans.b,x)+A1(Ans.a,x),Ans.a%=mod,Ans.b%=mod,Ans.c%=mod;scanf("%d",&m);while(m--) scanf("%d",&x),printf("%lld\n",((Ans.c+x*Ans.b+1ll*x*x%mod*Ans.a)%mod+mod)%mod);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2021-08-08 luogu P5043 【模板】树同构([BJOI2015]树的同构)
2021-08-08 luogu P5904 [POI2014]HOT-Hotels 加强版
2021-08-08 luogu P5903 【模板】树上 k 级祖先