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」州区划分相关推荐

  1. LOJ 2339 「WC2018」通道——边分治+虚树

    题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...

  2. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  3. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  4. 「WC2018」即时战略

    「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...

  5. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  6. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  7. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  8. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  9. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

最新文章

  1. Numpy.argsort()(Python)
  2. HDU 2047 阿牛的EOF牛肉串
  3. 英特尔发布其首个适配Win11的显卡驱动
  4. 【spark】Spark通过ClickHouse-Native-JDBC写入Clickhouse
  5. mongodb的安装和sql操作
  6. 【机器学习-西瓜书】三、线性回归;对数线性回归
  7. 集体智慧编程 - 读书笔记
  8. matlab寻找峰值的函数,Matlab---寻找峰值函数
  9. MongoDB中updateOne的正常使用
  10. 什么是骨传导耳机,骨传导耳机有什么优缺点
  11. BJDCTF 2nd writeup(二)
  12. 了解多层交换中的CEF FIB CAM TCAM
  13. 基于梁氏—克里曼信息流的因果分析理论及应用——应用部分
  14. 利用vscode高效阅读《You Don't Know JS》
  15. 使用FFmpeg 批量处理视频
  16. 沈阳计算机专业中专学校有哪些,沈阳市都有哪些中专学校是公立的
  17. python拼图验证码_针对滑动拼图验证码的pythonselenium解法!
  18. C++软件工程师之什么是宏?
  19. c语言计算阶乘的倒数和,for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和...
  20. 神奇的数据库密码,写对了密码也连不上数据库?

热门文章

  1. WebApi 数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。,ExceptionType:System.Security....
  2. RTUILabel+正则表达式
  3. 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
  4. 改变多目标跟踪领域!CMU等推出大规模多类别MOT数据集TAO
  5. 图像超分辨率也能改善天气预报?没错!
  6. 仅信用卡大小,性能比TX2强15倍,英伟达边缘AI计算新品Jetson Xavier NX
  7. 美国高级情报研究计划局(IARPA)发起公共安全问题预测机器学习挑战赛(总奖池10万美金)...
  8. 计算机视觉研究入门全指南
  9. 零基础程序员如何快速学会python
  10. 某程序员10个月时间做了30个私活单子,纯收入40万?