把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

luogu P5472 [NOI2019] 斗主地

题面传送门

我是真服了,猜结论这么牛逼。我tm应该猜个二次函数就写哪这个多废话。

首先看这个形式XX+Y感觉非常不爽,然后看样例发现所有能合并出来的序列的概率式一样的。

所以就猜概率是一样的,进一步得出概率是1CnAi

证明就考虑每次操作是下面一定是从n一直减一到1,上面两边分别从AinAi减到1,乘起来就是这个概率。

然后你手摸一下样例发现一次函数塞进去后这个期望也是一个一次函数。

然后你xjb乱拆系数范德蒙特卷积是可以化简证明出来的。做题的时候的过程卸载下面。

bi=j=1min(Ak,i)Ci1j1CniAkjj+j=Ak+1min(n,Ak+i)Ci1jAk1Cninjj

=j=1min(Ak,i)(j1)Ci1j1CniAkj+Ci1j1CniAkj+j=Ak+1min(n,Ak+i)Ci1jAk1Cninj(jAk1)+(Ak+1)Ci1jAk1Cninj

=Cn1Ak1+(Ak+1)Cn1Ak+1+j=1min(Ak,i)(i1)Ci2j2CniAkj+j=Ak+1min(n,Ak+i)Ci2jAk2Cninj(i1)

=Cn1Ak1+(Ak+1)Cn1Ak+(i1)(Cn2Ak2+Cn2Ak)

P=Akn+(nAk)(Ak+1)n+(i1)(Ak(Ak1)n(n1)+(nAk)(nAk1)n(n1))

然后进一步猜一猜二次函数塞进去也是二次函数。按照上面的方法一样推就好了。

ci=j=1min(Ak,i)Ci1j1CniAkjj2+j=Ak+1min(n,Ak+i)Ci1jAk1Cninjj2

=j=1min(Ak,i)Ci1j1CniAkj((j1)(j2)+3(j1)+1)+j=Ak+1min(n,Ak+i)Ci1jAk1Cninj((nj)(nj1)(2n1)(nj)+n2)

=Cn1Ak1+3(i1)Cn2Ak2+(i1)(i2)Cn3Ak3+(ni)(ni1)Cn3Ak(ni)(2n1)Cn2Ak+n2Cn1Ak

=Akn+3Ak(Ak1)(i1)n(n1)+(i1)(i2)Ak(Ak1)(Ak2)n(n1)(n2)+n(nAk)(ni)(2n1)(nAk)(nAk1)n(n1)+(ni)(ni1)(nAk)(nAk1)(nAk2)n(n1)(n2)

Ans.c=Akn3Ak(Ak1)n(n1)+2Ak(Ak1)(Ak2)n(n1)(n2)+n(nAk)(2n1)(nAk)(nAk1)n1+(nAk)(nAk1)(nAk2)n2

Ans.b=3Ak(Ak1)n(n1)3Ak(Ak1)(Ak2)n(n1)(n2)+(2n1)(nAk)(nAk1)n(n1)(2n1)(nAk)(nAk1)(nAk2)n(n1)(n2)

Ans.a=Ak(Ak1)(Ak2)n(n1)(n2)+(nAk)(nAk1)(nAk2)n(n1)(n2)

然后直接模拟即可,时间复杂度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);
}
posted @   275307894a  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 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 级祖先
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示