2024ICPC网络赛(2)-K.Match——匹配、奇妙的n4 DP
题目:https://qoj.ac/contest/1799/problem/9380
题意:给两个长度为
首先要知道一般二分图匹配计数大概是做不了的,那么这里必然要思考
对位运算考虑类似拆位的东西,比如 1xxxxx
,011xxxx
,01011x
,对于
- 如果
这一位是 , 中间总是两两有边存在。 的边的贡献则可以递归计算,假设其中答案分别是 两个序列,则(这里有点符号混用, 表示这个集合大小): - 如果
这一位是 ,则只考虑 的答案,假设分别是 两个序列,则
这样暴力转移最坏是
但是可以跑的飞快…
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define endl '\n' #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; constexpr int N=205; constexpr int MOD=998244353; int n,C[N][N],fact[N]; ll a[N],b[N],k; vector<int> id; void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;} vector<int> solve(int la,int ra,int lb,int rb,int j){ if(la>ra||lb>rb)return id; if(j==-1){//边界情况,不受到任何限制,相当于随便选 int sa=ra-la+1,sb=rb-lb+1,L=min(sa,sb); vector<int> ans(L+1); for(int i=0;i<=L;i++)ans[i]=(ll)C[sa][i]*C[sb][i]%MOD*fact[i]%MOD; return ans; } int pa=la-1,pb=lb-1; while(pa+1<=ra&&((a[pa+1]>>j)&1)==0)pa++; while(pb+1<=rb&&((b[pb+1]>>j)&1)==0)pb++; int L=min(ra-la+1,rb-lb+1); vector<int> ans(L+1); if(k>>j&1){ auto f=solve(la,pa,pb+1,rb,j-1); auto g=solve(pa+1,ra,lb,pb,j-1); for(int i=0;i<f.size();i++)for(int j=0;j<g.size();j++){ if(i+j>L)break; add(ans[i+j],(ll)f[i]*g[j]%MOD); } }else{ auto f=solve(la,pa,lb,pb,j-1); auto g=solve(pa+1,ra,pb+1,rb,j-1); int A0=pa-la+1,A1=ra-pa,B0=pb-lb+1,B1=rb-pb; f.resize(min(A0,B0)+1);g.resize(min(A1,B1)+1); for(int i=0;i<(int)f.size();i++)for(int j=0;j<(int)g.size();j++) for(int x=0;x<=min(A0-i,B1-j);x++)for(int y=0;y<=min(A1-j,B0-i);y++){ if(i+j+x+y>L)break; add(ans[i+j+x+y],(ll)f[i]*g[j]%MOD*C[A0-i][x]%MOD*C[B1-j][x]%MOD*fact[x]%MOD*C[A1-j][y]%MOD*C[B0-i][y]%MOD*fact[y]%MOD); } } return ans; } int main(){ fastio; fact[0]=1; for(int i=1;i<N;i++)fact[i]=(ll)fact[i-1]*i%MOD; for(int i=0;i<N;i++)C[i][0]=1; for(int i=0;i<N;i++)for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD; cin>>n>>k; id={1}; rep(i,1,n)cin>>a[i]; rep(i,1,n)cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+n+1); auto ans=solve(1,n,1,n,60); for(int i=1;i<=n;i++)cout<<ans[i]<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律