首页 > 其他分享 >[ABC321G] Electric Circuit 状压DP

[ABC321G] Electric Circuit 状压DP

时间:2023-11-24 18:03:03浏览次数:34  
标签:联通 int inv 状压 ABC321G 集合 jc DP mod

用到了好多技巧的状压DP

我们先统计总数然后除以m的阶乘就可以了

设f[i]表示状态为i的集合造成的贡献数(也就是状态为i的集合 不与集合外的点联通 且 这个集合联通块数是1 的情况数)

不与集合外的点联通的话只用考虑结合i之间连边,集合外那些点之间两边就可以啦

这个集合联通块数是1 就比较难处理了,有个技巧就是枚举包含1号的子集的f造成的贡献即可

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans;
const int mod=998244353,N=100010;
int jc[N],inv[N],cnt1[N],cnt2[N],tong1[1<<18],tong2[1<<18],f[1<<18];
int lowbit(int x){return x&(-x);}
int ksm(int a,int b,int mod)
{
	int res=1;
	for(;b;b>>=1,a=a*a%mod)
		if(b&1)res=res*a%mod;
	return res;
}
void YYCH()
{
	jc[0]=jc[1]=inv[0]=inv[1]=1;
	for(int i=2;i<=m;++i)jc[i]=jc[i-1]*i%mod;
	inv[m]=ksm(jc[m],mod-2,mod);
	for(int i=m-1;i>=1;--i)inv[i]=inv[i+1]*(i+1)%mod;
}
int C(int n,int m)
{
	if(m>n)return 0;
	return jc[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main()
{
	cin>>n>>m;
	YYCH();
	for(int i=1,x;i<=m;++i)scanf("%lld",&x),++cnt1[x];
	for(int i=1,x;i<=m;++i)scanf("%lld",&x),++cnt2[x];
	for(int i=0;i<=(1<<n)-1;++i)
		for(int j=1;j<=n;++j)
			if(!(i&(1<<(j-1))))
			{
				tong1[i|(1<<(j-1))]=tong1[i]+cnt1[j];
				tong2[i|(1<<(j-1))]=tong2[i]+cnt2[j];
			}
	for(int i=1;i<=(1<<n)-1;++i)
	{
		if(tong1[i]==tong2[i])
		{
			f[i]=jc[tong1[i]]*jc[m-tong1[i]]%mod;
			for(int j=(i-1)&i;j;j=(j-1)&i)
			if(lowbit(i)==lowbit(j))(f[i]-=f[j]*inv[m-tong1[j]]%mod*jc[tong1[i]-tong1[j]]%mod*jc[m-tong1[i]]%mod)%=mod;
			//cout<<"-> "<<i<<" "<<f[i]<<endl;
			(ans+=f[i])%=mod;
		}
		else f[i]=0;	
	}
	((ans%=mod)+=mod)%=mod;
	cout<<ans*inv[m]%mod;
	return 0;
}

标签:联通,int,inv,状压,ABC321G,集合,jc,DP,mod
From: https://www.cnblogs.com/wljss/p/17854412.html

相关文章

  • (Python)基于对称点模式(Symmetrized Dot Pattern,SDP)的多元、多通道、多传感器信号融合
    对称点模式(SymmetrizedDotPattern,SDP)算法可将复杂时间序列以散点的形式清晰映射在极坐标图中,可以使原始时域信号通过图形化的方式提高可视化能力。因为极坐标图像的特殊性,多元、多通道、多传感器信号信息可通过SDP方法融合在有限区域中。适用于多元、多通道、多传感器信号的融合......
  • ThreadPoolTaskExecutor类
    ThreadPoolTaskExecutor类可用来创建线程池并添加任务1TreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();2taskExecutor.setCorePoolSize(5);//设置核心线程数3taskExecutor.setMaxPollSize(10);//设置最大线程数4taskExecutor.setQu......
  • 2023华为杯研究生赛awdp-web复现
    被我们web队组会狠狠push了...但是看了下这个研究生赛的题目,难度还是不高的,还不至于队里佬们打实时比赛我看着都费劲那种...........
  • Centos系统udp丢包&内核参数优化
    echo0>/proc/irq/31/smp_affinity_listecho1>/proc/irq/33/smp_affinity_list这两个命令是用于设置Linux中中断处理程序的亲和性,以提高系统的性能和稳定性。在Linux系统中,系统中断(IRQ)是由硬件触发的,它们通常被用于处理来自硬件设备的请求(例如,网络接口卡、磁盘控制器......
  • 区间DP
    区间DP区间DP题目描述设有\(N\)堆石子排成一排,其编号为\(1,2,3,…,N\)。每堆石子有一定的质量,可以用一个整数来描述,现在要将这\(N\)堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺......
  • C# 中定义自己的ThreadPoolQueue
    目录一背景二源码及分析2.1源码展示2.2源码分析2.2.1定义ActionItemInfo2.2.2定义AutoProcess属性2.2.3分析ProcessQueuedActionItems方法一背景在实际的开发过程中,我们经常有一种需求就是我们的任务需要放到线程池中进行执行,并且这些任务需要逐一放到Queue中进行独立......
  • dpvs启动时coredump
    问题现象问题分析#根据core文件来打印堆栈信息gdb-clcore-worker-2.core.20196/root/code/dpvs/bin/dpvs解决问题大页内存2G不足导致段错误,分配4G后正常。......
  • 节点重启后初始化dpvs
    #加载大页内存echo2048>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepagesmount-thugetlbfsnodev/mnt/huge#加载vfio驱动modprobevfio-pci/usr/bin/chmoda+x/dev/vfio/usr/bin/chmod0666/dev/vfio/*echo1>/sys/module/vfio/param......
  • 经典dp
    K-Box_2023牛客暑期多校训练营2(nowcoder.com)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int,int>PII;constintN=1e6+110,mod=1e9+7;inta[N];intst[N];intf[N][2];signedmain(){ios::sync_with_st......
  • WebRTC ,P2P, UDP,NAT,信令,socket
    为什么WebRTC使用UDP?NAT穿透需要UDP。没有NAT穿透,就无法建立P2P连接。UDP不像TCP那样"保证送达“,因此WebRTC在用户级别提供这一特性。你提到的是正确的,NAT(网络地址转换)穿透通常需要使用UDP协议。NAT是一种网络技术,用于将私有IP地址转换为公共IP地址,以便在互联......