首页 > 其他分享 >Atcoder Grand Contest 060 D - Same Descent Set

Atcoder Grand Contest 060 D - Same Descent Set

时间:2023-05-22 23:34:34浏览次数:46  
标签:Atcoder Set Descent limits int sum cdots subseteq MOD

先推式子。设 \(f(S)\) 表示 decent 集合恰好为 \(S\) 的排列个数,\(g(S)\) 表示 \(S\) 是 \(p\) 的 decent 集合的一个子集的排列 \(p\) 个数,\(g'(\{a_1,a_2,\cdots,a_k\})=\dfrac{n!}{a_1!(a_2-a_1)!(a_3-a_2)!\cdots(a_k-a_{k-1})!(n-a_k)!}\),那么有:

\[\begin{aligned} ans=&\sum_{S}f(S)^2\\ =&\sum\limits_{S}(\sum\limits_{S\subseteq T_1}(-1)^{|T_1|-|S|}g(T_1))(\sum\limits_{S\subseteq T_2}(-1)^{|T_2|-|S|}g(T_2))\\ =&\sum\limits_{T_1}\sum\limits_{T_2}g(T_1)(-1)^{|T_1|}·g(T_2)(-1)^{|T_2|}·2^{|T_1\cap T_2|}\\ =&\sum\limits_{T_1}\sum\limits_{T_2}g'(T_1)(-1)^{|T_1|+1}·g'(T_2)(-1)^{|T_2|+1}·2^{n-1-|T_1\cup T_2|}\\ =&\sum\limits_{T_1}\sum\limits_{T_2}g'(T_1)(-0.5)^{|T_1|+1}·g'(T_2)(-0.5)^{|T_2|+1}·2^{n+1+|T_1\cap T_2|}\\ =&\sum\limits_{T_1}\sum\limits_{T_2}g'(T_1)(-0.5)^{|T_1|+1}·g'(T_2)(-0.5)^{|T_2|+1}·2^{n+1}(\sum\limits_{S\subseteq T_1,S\subseteq T_2}1) \end{aligned} \]

考虑最后一个式子的含义,相当于我先将 \(n\) 个元素划分为 \(p\) 个部分 \(a_1,a_2,\cdots,a_p\) 使得 \(\sum a_p=n\),再对于每个 \(a_i\),构造两个序列 \(b_{i,1},b_{i,2},\cdots,b_{i,q_i}\) 和 \(c_{i,1},c_{i,2},\cdots,c_{i,r_i}\),使得 \(\sum b_{i,j}=\sum c_{i,j}=a_i\),方案数为 \(\prod -\dfrac{1}{2(b_{i,j}!)}·\prod-\dfrac{1}{2(c_{i,j}!)}\),我们考虑设 \(f_i\) 为将长度为 \(i\) 的部分划分为若干个小部分的系数之和,显然 \(f_i=\sum\limits_{j=0}^{i-1}f_j·(-\dfrac{1}{2(i-j)!})\),再设 \(g_i\) 表示将长度为 \(i\) 的序列划分为若干个大部分的贡献之和,有 \(g_i=\sum\limits_{j=0}^{i-1}g_if_{i-j}^2\),两部分都可以分治 NTT 或者多项式求逆,时间复杂度 \(O(n\log n)\) 或 \(O(n\log^2n)\)。

const int MAXN=2e5;
const int MAXP=1<<19;
const int pr=3;
const int ipr=332748118;
const int MOD=998244353;
const int INV2=MOD+1>>1;
int qpow(int x,int e){int ret=1;for(;e;e>>=1,x=1ll*x*x%MOD)if(e&1)ret=1ll*ret*x%MOD;return ret;}
int rev[MAXP+5];
void NTT(vector<int>&a,int len,int type){
	int lg=31-__builtin_clz(len);
	for(int i=0;i<len;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
	for(int i=0;i<len;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int i=2;i<=len;i<<=1){
		int W=qpow((type<0)?ipr:pr,(MOD-1)/i);
		for(int j=0;j<len;j+=i){
			for(int k=0,w=1;k<(i>>1);k++,w=1ll*w*W%MOD){
				int X=a[j+k],Y=1ll*a[(i>>1)+j+k]*w%MOD;
				a[j+k]=(X+Y)%MOD;a[(i>>1)+j+k]=(X-Y+MOD)%MOD;
			}
		}
	}
	if(!~type){
		int iv=qpow(len,MOD-2);
		for(int i=0;i<len;i++)a[i]=1ll*a[i]*iv%MOD;
	}
}
vector<int>conv(vector<int>a,vector<int>b){
	int LEN=1;while(LEN<a.size()+b.size())LEN<<=1;
	a.resize(LEN,0);b.resize(LEN,0);NTT(a,LEN,1);NTT(b,LEN,1);
	for(int i=0;i<LEN;i++)a[i]=1ll*a[i]*b[i]%MOD;
	NTT(a,LEN,-1);return a;
}
int n,res,fac[MAXN+5],ifac[MAXN+5];
void init_fac(int n){
	for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++)ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD; 
	for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int f[MAXN+5],g[MAXN+5];
void calc_f(int l,int r){
	if(l==r)return;vector<int>A,B,C;int mid=l+r>>1;calc_f(l,mid);
	for(int i=l;i<=mid;i++)A.pb(f[i]);
	for(int i=0;i<=r-l;i++)B.pb(1ll*ifac[i]*(MOD-INV2)%MOD);
	C=conv(A,B);
	for(int i=mid+1;i<=r;i++)f[i]=(f[i]+C[i-l])%MOD;
	calc_f(mid+1,r);
}
void calc_g(int l,int r){
	if(l==r)return;vector<int>A,B,C;int mid=l+r>>1;calc_g(l,mid);
	for(int i=l;i<=mid;i++)A.pb(g[i]);
	for(int i=0;i<=r-l;i++)B.pb(1ll*f[i]*f[i]%MOD);
	C=conv(A,B);
	for(int i=mid+1;i<=r;i++)g[i]=(g[i]+C[i-l])%MOD;
	calc_g(mid+1,r);
}
int main(){
	scanf("%d",&n);init_fac(MAXN);f[0]=g[0]=1;calc_f(0,n);calc_g(0,n);
	printf("%d\n",1ll*g[n]*qpow(2,n+1)%MOD*fac[n]%MOD*fac[n]%MOD);
	return 0;
}

标签:Atcoder,Set,Descent,limits,int,sum,cdots,subseteq,MOD
From: https://www.cnblogs.com/tzcwk/p/agc060D.html

相关文章

  • java学习日记20230522-TreeSet
    有序键值对集合publicclassTreeSetExercise{publicstaticvoidmain(String[]args){Integerinteger=newInteger(10);TreeSettreeSet=newTreeSet(newComparator(){@Overridepublicintcompare(Objecto1,Obj......
  • Atcoder Beginner Contest ABC302 题解
    代码见此:https://atcoder.jp/contests/abc302/submissions?f.Task=&f.LanguageName=&f.Status=&f.User=frequenter。AAttackhttps://atcoder.jp/contests/abc302/tasks/abc302_a直接计算a/b,有余数的话答案加一。BFindSnukehttps://atcoder.jp/contests/abc302/tasks/abc......
  • iOS 缩放等级 Set the Zoom Level of an MKMapView
    SettheZoomLevelofanMKMapViewhttp://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/IfyouhaveeverbuiltawebapplicationusingtheGoogleMapsAPI,youarelikelyintimatelyfamiliarwiththislineofcode:map.set......
  • AtCoder Regular Contest 132 D Between Two Binary Strings
    洛谷传送门AtCoder传送门提供一个dp思路。下文设串长为\(n\),串中\(1\)个数为\(m\)。考虑如何求\(d(s,t)\)。设\(s\)的\(1\)位置分别为\(a_1,a_2,...,a_m\),\(t\)的\(1\)位置分别为\(b_1,b_2,...,b_m\)。那么\(d(s,t)=\sum\limits_{i=1}^m|a_i-b......
  • Failed to execute 'setSelectionRange' on 'HTMLInputElement'
    jcubic commented on7Jan2016WhenIusenumberinputI'vegoterrorinGoogleChromeUncaughtInvalidStateError:Failedtoexecute'setSelectionRange'on'HTMLInputElement':Theinputelement'stype('number')......
  • Java入门9(HashSet,File文件类)
    HashSetjdk1.7之前,使用数组加链表的方式实现jdk1.8之后,在链表长度大于8并且数组长度超过32的情况下,会转成红黑树结构HashSet的本质是一个HashMap,它所有的value都是一致的,传入的参数作为key,因此HashSet中不允许重复数据存储的时候,键值对位于的数组位置,之和key的HashCode值有关......
  • APP启动异常崩溃--pointer being freed was not allocated *** set a breakpoint in m
    一、问题场景APP启动异常崩溃BlockChainStep(1332,0x7000057ad000)malloc:*errorforobject0x600000008300:pointerbeingfreedwasnotallocated*setabreakpointinmalloc_error_breaktodebug二、崩溃原因在Xcode8中,如果你的图片资源文件里有16位图或者图片显示模......
  • set character_set_database=utf8;set character_set_server=utf8;
    D:\mysql-5.6.24-win32\bin\mysql-urootWelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis55Serverversion:5.6.24MySQLCommunityServer(GPL)Copyright(c)2000,2015,Oracleand/oritsaffiliates.......
  • AtCoder Beginner Contest 302 Ex Ball Collector
    洛谷传送门AtCoder传送门考虑如果只询问一次怎么做。连边\((a_i,b_i)\),对于每个连通块分别考虑。这是ARC111B,如果一个连通块是树,肯定有一个点不能被选;否则有环,一定能构造一种方案,使得每个点都被选。那么现在对于每个点都要求,考虑dfs时合并当前的\((a_u,b_u)\),并且使用......
  • [atARC156F]Make Same Set
    考虑网络流,具体建图如下:整张图共\(4\)层,用\((i,j)\)表示第\(i\)层的第\(j\)个点,则边集包含从\(S\)向\((1,i)\)连流量为\(1\)的边从\((1,i)\)向\((2,a_{i})\)和\((2,b_{i})\)连流量为\(1\)的边从\((2,i)\)向\((3,i)\)连流量为\(1\)的边从\((3,a_{i})\)和\((3,c_{i})\)向\((4,......