首页 > 其他分享 >2022 CCPC 桂林

2022 CCPC 桂林

时间:2023-02-01 23:14:44浏览次数:48  
标签:发现 const int void CCPC 桂林 2022 return include

B

题面看着很吓人,但只要读完就发现很好理解,并且根据题意暴力状压DP即可。
原本忘记可以调顺序,发现后纠结了一下,注意到重复选必然更劣故不用管,所以状压转移的时候,直接枚举选哪个就可以了,经过预处理后效率为\(O(n2^{3m}+nm)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=405,M=20;
void Max(int& x,int y){
	if(y>x) x=y;
}
void Min(int& x,int y){
	if(y<x) x=y;
}
int n,m,pw[M];
struct node{
	int op,tim,mem;
}p[M],tmp[N][M];
void init1(){
	int idx[N];
	idx['O']=0; idx['W']=1; idx['T']=2; idx['M']=3; idx['R']=4;
	for(int i=0;i<M;i++) pw[i]=(1<<i);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c1,c2;
			scanf(" %c%c,%d/%d",&c1,&c2,&tmp[i][j].tim,&tmp[i][j].mem);
			tmp[i][j].op=idx[(int)c1];
		}
	}
	
	for(int j=1;j<=m;j++){
		for(int i=1;i<=n;i++){
			node u=tmp[i][j];
			Max(p[j].tim,u.tim);
			Max(p[j].mem,u.mem);
			if(!p[j].op && u.op){
				p[j].op=u.op;
				break;
			}
		}
	}
	//for(int j=1;j<=m;j++) cout<<j<<" "<<p[j].op<<" "<<p[j].tim<<" "<<p[j].mem<<endl;
}

int a[N],b[N],lim[1<<18];
void init2(){
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++){
			node u=tmp[i][j+1],v=p[j+1];
			
			if(u.op && u.op==v.op) a[i]+=pw[j*3];
			if(u.tim==v.tim) a[i]+=pw[j*3+1];
			if(u.mem==v.mem) a[i]+=pw[j*3+2];
			
			if(u.op && u.op!=v.op) b[i]+=pw[j*3];
			if(u.tim>v.tim) b[i]+=pw[j*3+1];
			if(u.mem>v.mem) b[i]+=pw[j*3+2];
		}
		//cout<<i<<" "<<a[i]<<" "<<b[i]<<endl;
	}
	
	for(int i=0;i<pw[m*3];i++){
		int u=0;
		for(int j=0;j<m;j++){
			if( !(i&pw[j*3]) ) u+=pw[j*3];
		}
		lim[i]=u*7;
	}
}

int f[1<<18],frt[1<<18],pos[1<<18];
void dp(){
	memset(f,0x3f,sizeof(f));
	f[0]=0;
	for(int j=0;j<pw[m*3];j++){
		for(int i=1;i<=n;i++){
			if(b[i]&lim[j]) continue;
			int u=(j|(a[i]&lim[j]));
			if(f[j]+1<f[u]){
				f[u]=f[j]+1;
				frt[u]=j;
				pos[u]=i;
			}
		}
	}
	int s=pw[m*3]-1;
	for(int j=0;j<m;j++) if(!p[j+1].op) s-=pw[j*3];
	//cout<<"s="<<s<<endl;
	cout<<f[s]<<endl;
	stack<int>q;
	while(s){
		q.push(pos[s]);
		s=frt[s];
	}
	while(!q.empty()) printf("%d ",q.top()),q.pop();
}
int main()
{
	//freopen("1.in","r",stdin);
	init1();
	init2();
	dp();
	return 0;
}

D

列出式子后直接往普通幂转下降幂的方向想(因为变成下降幂之后就可以无穷级数求和再求导了),然后搞了半天发现不可做(中间推错了几次,一度以为可做),因为最后变成\(f(k)=\sum_{i=1}^{k} \{k,i \}g(i)\),用各种第二类斯特林数的公式都难以高效计算出所有的\(f(k)\)。

所以考虑其它方向:
首先发现\(E(n^k)\)中的n拆成两部分后,用二项式展开是EGF的卷积形式,所以求出一张牌的期望F后,\(F^n\)即为n张牌的期望。
列出级数的式子后发现是等比*k次等差,考虑经典错位相减,然后发现F(k)可以化成i<k的F(i)乘组合数,用EGF即可求出F。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=(1<<20)+5,P=998244353,G[2]={3,(P+1)/3};
int Mul(int a,int b){
	return 1ll*a*b%P;
}
int Add(int a,int b){
	a+=b;
	if(a>=P) a-=P;
	if(a<0) a+=P;
	return a;
}
inline int fpw(int a,int x){
    int s=1;
    for(;x;x>>=1,a=1ll*a*a%P) if(x&1) s=1ll*s*a%P;
    return s;
}
int rv[N],gp[2][N],iv[N],fc[N],fv[N];
void init(int n){
	fc[0]=1;
    for(int i=1;i<n;i++) iv[i]=fpw(i,P-2),fc[i]=1ll*fc[i-1]*i%P;
    fv[n-1]=fpw(fc[n-1],P-2);
    for(int i=n-2;~i;i--) fv[i]=1ll*fv[i+1]*(i+1)%P;
    for(int p=0;p<2;p++){
        for(int i=1;i<n;i<<=1){
            gp[p][i]=1;
            int t=fpw(G[p],(P-1)/(i<<1));
            for(int j=i+1;j<(i<<1);j++) gp[p][j]=1ll*gp[p][j-1]*t%P;
        }
    }
}
void print(char name[],int n,int* a){
	printf("%s n=%d\n",name,n);
	for(int i=0;i<n;i++) cout<<a[i]<<" "; puts(""); 
}
inline void dft(int* a,int n,int p){
    for(int i=0;i<n;i++) if(i<rv[i]) swap(a[i],a[rv[i]]);
    for(int i=1;i<n;i<<=1){
        for(int j=0;j<n;j+=(i<<1)){
            for(int k=0;k<i;k++){
                int &A=a[i+j+k],&B=a[j+k],t=1ll*gp[p][i+k]*A%P;
                A=B-t; if(A<0) A+=P;
                B=B+t; if(B>=P) B-=P;
            }
        }
    }
    if(p) for(int i=0;i<n;i++) a[i]=1ll*a[i]*iv[n]%P;
}
inline int Rev(int m){
    int p=0,n=1;
    while(n<m) n<<=1,p++;
    for(int i=0;i<n;i++) rv[i]=(rv[i>>1]>>1)|((i&1)<<(p-1));
    return n;
}
inline void poly_mul(int m,int* A,int* B,int* C){
    int n=Rev(m);
    dft(A,n,0); dft(B,n,0);
    for(int i=0;i<n;i++) C[i]=1ll*A[i]*B[i]%P;
    dft(C,n,1);
    fill(C+m,C+n,0);
}
//C=A*B m:需要C的0~(m-1)项,m~(n-1)为空
int C[N],D[N];
inline void poly_inv(int m,int *a, int *b) {
    if(m==1){
        b[0]=fpw(a[0],P-2);
        return;
    }
    poly_inv((m + 1)>>1,a,b);
    int n=Rev(m<<1);
    copy(a,a+m,C);
    fill(C+m,C+n,0);
    dft(b,n,0); dft(C,n,0);
    for(int i=0;i<n;i++) b[i]=1ll*b[i]*(P+2-1ll*b[i]*C[i]%P)%P;
    dft(b,n,1);
    fill(b+m,b+n,0);
}
//a*b=1,给定a的0~(m-1)项,返回b的0~(m-1)项
//需要保证初始b为空!
inline void poly_Ln(int m,int* a,int* b){
	poly_inv(m,a,b);
	for(int i=0;i<m-1;i++) C[i]=1ll*a[i+1]*(i+1)%P; C[m-1]=0;
    int n=Rev(m<<1);
    fill(C+m,C+n,0);
    dft(C,n,0); dft(b,n,0);
    for(int i=0;i<n;i++) b[i]=1ll*C[i]*b[i]%P;
    dft(b,n,1);
	for(int i=m-1;i;i--) b[i]=1ll*b[i-1]*iv[i]%P; b[0]=0;
	fill(b+m,b+n,0);
}
//b=Ln(a),给定a的0~(m-1)项,返回b的0~(m-1)项
//需要保证初始b为空!
inline void poly_Exp(int m,int* a,int* b){
	if(m==1){
		b[0]=1;
		return;
	}
	poly_Exp((m+1)>>1,a,b);
	poly_Ln(m,b,D);
	for(int i=0;i<m;i++) D[i]=(P+a[i]-D[i]+(i==0))%P;
	int n=Rev(m<<1);
    dft(b,n,0); dft(D,n,0);
    for(int i=0;i<n;i++) b[i]=1ll*b[i]*D[i]%P;
    dft(b,n,1);
    fill(b+m,b+n,0);
    fill(D,D+n,0);
}
//b=Exp(a),给定a的0~(m-1)项,返回b的0~(m-1)项
//需要保证初始b为空!
int n,m,a,b,p,q;
int A[N],B[N],E[N],F[N],g[N];
int main(){
	cin>>n>>m>>a>>b;
	init((n+m)<<2);
	p=Mul(a,fpw(b,P-2));
	q=Add(P+1,-p);
	B[0]=1;
	for(int i=0;i<=m;i++) A[i]=fv[i],B[i]=Add(B[i],P-Mul(q,A[i]));
	poly_inv(m+1,B,E);
	poly_mul(m+m+1,A,E,F);
	fill(F+m+1,F+m+m+1,0);
	poly_Ln(m+1,F,g);
	fill(F,F+m+1,0);
	for(int i=0;i<=m;i++) g[i]=Mul(g[i],n);
	poly_Exp(m+1,g,F);
	for(int i=0;i<=m;i++) printf("%d\n",Mul(F[i],fc[i]));
	return 0;
}

K

L

标签:发现,const,int,void,CCPC,桂林,2022,return,include
From: https://www.cnblogs.com/szsz/p/17070121.html

相关文章

  • 【PER #1】捉迷藏 / Ptz2022 Day1.Kyoto U L 题解
    今天心血来潮想改一改pj的题,发现了这场easyround的A还没改……跟自己和解了,想了两天没想明白,说说大致思路。题目链接只考虑一组询问怎么做,先把\(v\)当作根,称......
  • 原点安全入选CCSIP 2022 中国网络安全行业全景册(第五版)
    2023年2月1日,FreeBuf咨询正式发布 《CCSIP(ChinaCyberSecurityPanorama)2022中国网络安全行业全景册(第五版)》。原点安全首次参与并入选数据安全分类下数据安全治理(解决方......
  • NOI2022冒泡排序
    首先考虑A性质的点。区间最小值为\(1\)的限制等价于要求区间所有值为\(1\)。另外一种限制等价于区间不全为\(1\)。把一定是\(1\)的做一个区间覆盖。其他部分暂且......
  • 2022下半年盘点:国产数据库重大更新及技术要点汇总
    2022下半年行业回顾云原生、分布式发展如火如荼2022年,数据库行业发展迅速,并呈现出若干鲜明特点。各数据库厂商及产品均取得长足进步,在部分重点技术领域有所突破,其中以国产......
  • CatCTF 2022 BugCat复现
    CatCTF2022BugCat复现脱壳拿到题目,发现题目是套了壳子的,经过检查发现是UPX改,使用x32dbg进行调试,在TLS回调中过掉下图所示的对start函数头部是否存在断点的检测。......
  • 2022-2023 ICPC Asia East - Shenyang Regional Contest - 校内模拟总结
    我菜死了A显然重叠部分积分\(\frac{1}{3}\),前面的积分累加就行。仔细思考题目,主要是好久没做题了。B不会,神秘题,咕咕咕C随便什么做法都能过D???E树形背包后容斥,套......
  • 【题解】[LNOI2022] 盒
    题目分析:我们可以对每一条边单独计算贡献,这样会发现贡献很好算:\[ans=\sum_{i=0}^{n-1}w_i\sum_{j=0}^S|j-s_i|\binom{i+j-1}{i-1}\binom{S-j+n-i-1}{n......
  • Windows Server 2022 中文版、英文版下载 (updated Jan 2023)
    WindowsServer2022正式版,2023年1月更新,持续更新中...请访问原文链接:https://sysin.org/blog/windows-server-2022/,查看最新版。原创作品,转载请保留出处。作者主页......
  • 在2022中央经济会议下,智能安防在2023年有何新机遇?
    2022年12月中旬,维持两天的中央经济工作会议成功落下帷幕。会议指出,2022年国内各行各业经营面临着需求收缩、供给冲击及预期转弱等多重压力的冲击,来年需要着力扩大国内需求,优......
  • [RCTF 2022] Reverse赛题复现
    突然发现还没搞完,占个坑先,也不知道什么时候填上(心虚)huowang大概是qemu起了一个新的迷宫,然后又走了check里面那个map的迷宫,两个迷宫都得走过才算对。学长用unicorn模拟把......