loj#2340. 「WC2018」州区划分
FWT&&FMT板子
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int _=1e2; const int maxn=21+5; const int fbin=(1<<21)+_; const LL mod=998244353; LL quick_pow(LL A,int p) {LL ret=1;while(p!=0){if(p%2==1)ret=ret*A%mod;A=A*A%mod;p/=2;}return ret; }//--------------------------------------------------def--------------------------------------------------------struct node {int x,y,next; }a[maxn*maxn];int len,last[maxn]; void ins(int x,int y) {len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } int w[maxn],du[maxn]; int fa[maxn]; int findfa(int x) {if(x==fa[x])return x;fa[x]=findfa(fa[x]);return fa[x]; }//--------------------------------------------pre--------------------------------------------------------------int cnt[fbin]; LL h[fbin],g[maxn][fbin],f[maxn][fbin]; void FWT(LL *a,int n,int op) {for(int i=1;i<n;i<<=1)for(int j=0;j<n;j+=(i<<1))for(int k=0;k<i;k++)if(op==1)a[j+k+i]=(a[j+k+i]+a[j+k])%mod;else a[j+k+i]=(a[j+k+i]-a[j+k]+mod)%mod; } int main() {int n,li,m,p,x,y;scanf("%d%d%d",&n,&m,&p); li=(1<<n);len=1;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);ins(x,y),ins(y,x);}for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int zt=1;zt<li;zt++){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)h[zt]+=w[i],cnt[zt]++;h[zt]=quick_pow(quick_pow(h[zt],mod-2),p);bool bk=true;memset(du,0,sizeof(du));for(int i=1;i<=n;i++)fa[i]=i;for(int i=2;i<=len;i+=2)if( ((1<<(a[i].x-1))&zt) && ((1<<(a[i].y-1))&zt) )du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];int rt=0;for(int i=1;i<=n;i++){if(du[i]%2==1){bk=false;break;}if((1<<(i-1))&zt){if(rt==0)rt=findfa(i);else if(rt!=findfa(i)){bk=false;break;}}}if(bk==false){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)g[cnt[zt]][zt]+=w[i];g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);}}//......pre.........for(int i=0;i<=n;i++)FWT(g[i],li,1);f[0][0]=1;FWT(f[0],li,1);for(int i=1;i<=n;i++){for(int j=0;j<i;j++)for(int zt=0;zt<li;zt++)f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;FWT(f[i],li,-1);for(int zt=0;zt<li;zt++){if(cnt[zt]!=i)f[i][zt]=0;f[i][zt]=f[i][zt]*h[zt]%mod;}if(i!=n)FWT(f[i],li,1);}printf("%lld\n",f[n][li-1]);return 0; }
FWT or
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int _=1e2; const int maxn=21+5; const int fbin=(1<<21)+_; const LL mod=998244353; const LL inv2=mod/2+1; LL quick_pow(LL A,int p) {LL ret=1;while(p!=0){if(p%2==1)ret=ret*A%mod;A=A*A%mod;p/=2;}return ret; }//--------------------------------------------------def--------------------------------------------------------struct node {int x,y,next; }a[maxn*maxn];int len,last[maxn]; void ins(int x,int y) {len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } int w[maxn],du[maxn]; int fa[maxn]; int findfa(int x) {if(x==fa[x])return x;fa[x]=findfa(fa[x]);return fa[x]; }//--------------------------------------------pre--------------------------------------------------------------int cnt[fbin]; LL h[fbin],g[maxn][fbin],f[maxn][fbin]; void FWT(LL *a,int n,int op) {for(int i=1;i<n;i<<=1)for(int j=0;j<n;j+=(i<<1))for(int k=0;k<i;k++){LL t1=a[j+k],t2=a[j+k+i];a[j+k]=(t1+t2)%mod;a[j+k+i]=(t1-t2+mod)%mod;if(op==-1)a[j+k]=a[j+k]*inv2%mod,a[j+k+i]=a[j+k+i]*inv2%mod;} } int main() {int n,li,m,p,x,y;scanf("%d%d%d",&n,&m,&p); li=(1<<n);len=1;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);ins(x,y),ins(y,x);}for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int zt=1;zt<li;zt++){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)h[zt]+=w[i],cnt[zt]++;h[zt]=quick_pow(quick_pow(h[zt],mod-2),p);bool bk=true;memset(du,0,sizeof(du));for(int i=1;i<=n;i++)fa[i]=i;for(int i=2;i<=len;i+=2)if( ((1<<(a[i].x-1))&zt) && ((1<<(a[i].y-1))&zt) )du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];int rt=0;for(int i=1;i<=n;i++){if(du[i]%2==1){bk=false;break;}if((1<<(i-1))&zt){if(rt==0)rt=findfa(i);else if(rt!=findfa(i)){bk=false;break;}}}if(bk==false){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)g[cnt[zt]][zt]+=w[i];g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);}}//......pre.........for(int i=0;i<=n;i++)FWT(g[i],li,1);f[0][0]=1;FWT(f[0],li,1);for(int i=1;i<=n;i++){for(int j=0;j<i;j++)for(int zt=0;zt<li;zt++)f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;FWT(f[i],li,-1);for(int zt=0;zt<li;zt++){if(cnt[zt]!=i)f[i][zt]=0;f[i][zt]=f[i][zt]*h[zt]%mod;}if(i!=n)FWT(f[i],li,1);}printf("%lld\n",f[n][li-1]);return 0; }
FWT xor
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int _=1e2; const int maxn=21+5; const int fbin=(1<<21)+_; const LL mod=998244353; const LL inv2=mod/2+1; LL quick_pow(LL A,int p) {LL ret=1;while(p!=0){if(p%2==1)ret=ret*A%mod;A=A*A%mod;p/=2;}return ret; }//--------------------------------------------------def--------------------------------------------------------struct node {int x,y,next; }a[maxn*maxn];int len,last[maxn]; void ins(int x,int y) {len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } int w[maxn],du[maxn]; int fa[maxn]; int findfa(int x) {if(x==fa[x])return x;fa[x]=findfa(fa[x]);return fa[x]; }//--------------------------------------------pre--------------------------------------------------------------int cnt[fbin]; LL h[fbin],g[maxn][fbin],f[maxn][fbin]; void FMT(LL *a,int n,int li,int op) {for(int i=1;i<=n;i++)for(int zt=0;zt<li;zt++)if((1<<(i-1))&zt)a[zt]=(a[zt]+op*a[zt^(1<<i-1)]+mod)%mod; } int main() {int n,li,m,p,x,y;scanf("%d%d%d",&n,&m,&p); li=(1<<n);len=1;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);ins(x,y),ins(y,x);}for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int zt=1;zt<li;zt++){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)h[zt]+=w[i],cnt[zt]++;h[zt]=quick_pow(quick_pow(h[zt],mod-2),p);bool bk=true;memset(du,0,sizeof(du));for(int i=1;i<=n;i++)fa[i]=i;for(int i=2;i<=len;i+=2)if( ((1<<(a[i].x-1))&zt) && ((1<<(a[i].y-1))&zt) )du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];int rt=0;for(int i=1;i<=n;i++){if(du[i]%2==1){bk=false;break;}if((1<<(i-1))&zt){if(rt==0)rt=findfa(i);else if(rt!=findfa(i)){bk=false;break;}}}if(bk==false){for(int i=1;i<=n;i++)if((1<<(i-1))&zt)g[cnt[zt]][zt]+=w[i];g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);}}//......pre.........for(int i=0;i<=n;i++)FMT(g[i],n,li,1);f[0][0]=1;FMT(f[0],n,li,1);for(int i=1;i<=n;i++){for(int j=0;j<i;j++)for(int zt=0;zt<li;zt++)f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;FMT(f[i],n,li,-1);for(int zt=0;zt<li;zt++){if(cnt[zt]!=i)f[i][zt]=0;f[i][zt]=f[i][zt]*h[zt]%mod;}if(i!=n)FMT(f[i],n,li,1);}printf("%lld\n",f[n][li-1]);return 0; }
转载于:https://www.cnblogs.com/AKCqhzdy/p/10686422.html
loj#2340. 「WC2018」州区划分相关推荐
- LOJ 2339 「WC2018」通道——边分治+虚树
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...
- Loj #3111. 「SDOI2019」染色
Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
- LOJ#2230. 「BJOI2014」大融合
LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...
- loj#2143. 「SHOI2017」组合数问题
loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...
- LOJ#2542. 「PKUWC2018」随机游走
LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...
- LOJ#2145. 「SHOI2017」分手是祝愿
LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1,a2...an唯一对应了一个最优 ...
- Loj #2568. 「APIO2016」烟花表演
Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...
最新文章
- Numpy.argsort()(Python)
- HDU 2047 阿牛的EOF牛肉串
- 英特尔发布其首个适配Win11的显卡驱动
- 【spark】Spark通过ClickHouse-Native-JDBC写入Clickhouse
- mongodb的安装和sql操作
- 【机器学习-西瓜书】三、线性回归;对数线性回归
- 集体智慧编程 - 读书笔记
- matlab寻找峰值的函数,Matlab---寻找峰值函数
- MongoDB中updateOne的正常使用
- 什么是骨传导耳机,骨传导耳机有什么优缺点
- BJDCTF 2nd writeup(二)
- 了解多层交换中的CEF FIB CAM TCAM
- 基于梁氏—克里曼信息流的因果分析理论及应用——应用部分
- 利用vscode高效阅读《You Don't Know JS》
- 使用FFmpeg 批量处理视频
- 沈阳计算机专业中专学校有哪些,沈阳市都有哪些中专学校是公立的
- python拼图验证码_针对滑动拼图验证码的pythonselenium解法!
- C++软件工程师之什么是宏?
- c语言计算阶乘的倒数和,for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和...
- 神奇的数据库密码,写对了密码也连不上数据库?
热门文章
- WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....
- RTUILabel+正则表达式
- 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
- 改变多目标跟踪领域!CMU等推出大规模多类别MOT数据集TAO
- 图像超分辨率也能改善天气预报?没错!
- 仅信用卡大小,性能比TX2强15倍,英伟达边缘AI计算新品Jetson Xavier NX
- 美国高级情报研究计划局(IARPA)发起公共安全问题预测机器学习挑战赛(总奖池10万美金)...
- 计算机视觉研究入门全指南
- 零基础程序员如何快速学会python
- 某程序员10个月时间做了30个私活单子,纯收入40万?