[loj2340][FWT][子集卷积]州区划分

2023-10-16 03:08

本文主要是介绍[loj2340][FWT][子集卷积]州区划分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

传送门

题解

看懂题需要一会…
朴素的dp就可以列出一个方程
f [ m a s k ] = 1 r [ i ] p ∑ j ∣ k = m a s k f [ j ] ∗ r [ k ] p f[mask]=\frac{1}{r[i]^p}\sum_{j|k=mask} f[j]*r[k]^p f[mask]=r[i]p1jk=maskf[j]r[k]p
其中 r [ i ] r[i] r[i]表示 i i i状态下的人数
那么暴力枚举子集就是 3 n 3^n 3n的噜
然后发现这其实是一个裸的子集卷积
于是就可以直接卷一下完事了…

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline int read()
{int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int stack[20];
inline void write(int x)
{if(x<0){putchar('-');x=-x;}if(!x){putchar('0');return;}int top=0;while(x)stack[++top]=x%10,x/=10;while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(int x){write(x);putchar('\n');}
const int MAXN=22;
const int mod=998244353;
const int MAXMASK=(1<<21);
int A[MAXN],B[MAXN];
void fwt(int *y,int len,int on)
{for(int i=1;i<len;i<<=1)for(int j=0;j<len;j+=(i<<1))for(int k=0;k<i;k++){if(on==1)y[j+k+i]=(y[j+k]+y[j+k+i])%mod;else y[j+k+i]=(y[j+k+i]-y[j+k]+mod)%mod;}
}
int pow_mod(int a,int b)
{int ret=1;while(b){if(b&1)ret=1LL*ret*a%mod;a=1LL*a*a%mod;b>>=1;}return ret;
}
int f[MAXN][MAXMASK],ok[MAXMASK],bin[25],w[MAXN],r[MAXMASK],ct[MAXMASK];int C[MAXN][MAXMASK],inv[MAXMASK];
int n,m,P,mp[MAXN][MAXN];
int du[MAXN],rt[MAXN];
int findrt(int x){return rt[x]==x?rt[x]:rt[x]=findrt(rt[x]);}
void ad(int &x,int y){x+=y;if(x>=mod)x-=mod;}
int main()
{
//	freopen("walk2.in","r",stdin);bin[0]=1;for(int i=1;i<=21;i++)bin[i]=bin[i-1]<<1;n=read();m=read();P=read();for(int i=1;i<=m;i++){int x=read(),y=read();mp[x][y]++;mp[y][x]++;}for(int i=1;i<=n;i++)w[i]=read();for(int i=0;i<bin[n];i++){ok[i]=1;memset(du,0,sizeof(du));int cnt=0;for(int j=1;j<=n;j++)rt[j]=j;for(int j=1;j<=n;j++)if(i&bin[j-1])r[i]+=w[j],cnt++,ct[i]++;for(int j=1;j<=n;j++)if(i&bin[j-1])for(int k=j+1;k<=n;k++)if(i&bin[k-1]&&mp[j][k]){du[j]++,du[k]++;int u=findrt(j),v=findrt(k);if(u!=v)rt[u]=v,cnt--;}if(ct[i]==1)ok[i]=0;bool tf=false;for(int j=1;j<=n;j++)if(du[j]&1){tf=true;break;}tf|=(cnt!=1);ok[i]&=tf;r[i]=pow_mod(r[i],P);if(ok[i])ad(C[ct[i]][i],r[i]);inv[i]=pow_mod(r[i],mod-2);}for(int i=1;i<=n;i++)fwt(C[i],bin[n],1);f[0][0]=1;fwt(f[0],bin[n],1);int ans;for(int i=1;i<=n;i++){for(int j=0;j<i;j++)for(int k=0;k<bin[n];k++)ad(f[i][k],1LL*f[j][k]*C[i-j][k]%mod);fwt(f[i],bin[n],-1);for(int j=0;j<bin[n];j++)f[i][j]=1LL*f[i][j]*inv[j]%mod;
//		if(i==n)ans=f[i][bin[n]-1];if(i!=n)fwt(f[i],bin[n],1);
//			for(int k=0;k<bin[n];k++)D[i]=1LL*f[i][k]*C[j][k]%mod;}pr2(f[n][bin[n]-1]);return 0;
}

这篇关于[loj2340][FWT][子集卷积]州区划分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218581

相关文章

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。         一般来说,晶圆光刻、制造、测试等级为100级或1000级的洁净间,百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个;等级为1000级的洁净间要求0.5微米的尘埃粒子数不得超过每立方米35200个。         晶圆切割或封装工序一

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

n条直线最多能划分出多少个平面?

N条直线,两两相交,其交点各不不同,则产生的交点数目为N个数中取2个数的组合; 同时,也只有这种情况下(两两相交,也交点不同),分割的平面数最多, 数目为: 2 + (N-1)(N+2)/2.  这里求最少平面数没有意义,因为最少平面数就是N+1, 即N条直线两两平行的时候,分割的平面最少。 举例: 1条直线分割平面数最多为2; a1 = 2 2条直线分割平面数最多为4;

深度学习基础--卷积的变种

随着卷积同经网络在各种问题中的广泛应用,卷积层也逐渐衍生出了许多变种,比较有代表性的有: 分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolution ),下面分别介绍下。 1. 分组卷积 在普通的卷积操作中,一个

在不损坏数据的情况下给WIN7重新划分分区

小易接到个求助电话:我的机器上已经装好了系统,但是只有一个分区。我不想重装系统重新分区,能不能再分出一个分区?   这个故障可能是困惑很多网友的一个故障。一般,有一些第三方的软件可以实现这些功能。但是,现在在 Windows Vista/Windows 7 里允许你对现有分区大小进行一定范围的调整。   来看一下操作办法:   准备工作   这个操作必须要求你的文件系统是 N