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=+;
const int fbin=(<<)+_;
const LL mod=;
LL quick_pow(LL A,int p)
{
LL ret=;
while(p!=)
{
if(p%==)ret=ret*A%mod;
A=A*A%mod;p/=;
}
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=;i<n;i<<=)
for(int j=;j<n;j+=(i<<))
for(int k=;k<i;k++)
if(op==)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=(<<n);
len=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int zt=;zt<li;zt++)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)h[zt]+=w[i],cnt[zt]++;
h[zt]=quick_pow(quick_pow(h[zt],mod-),p); bool bk=true;
memset(du,,sizeof(du));
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=len;i+=)
if( ((<<(a[i].x-))&zt) && ((<<(a[i].y-))&zt) )
du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];
int rt=;
for(int i=;i<=n;i++)
{
if(du[i]%==){bk=false;break;}
if((<<(i-))&zt)
{
if(rt==)rt=findfa(i);
else if(rt!=findfa(i)){bk=false;break;}
}
}
if(bk==false)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)g[cnt[zt]][zt]+=w[i];
g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);
}
} //......pre......... for(int i=;i<=n;i++)FWT(g[i],li,);
f[][]=;FWT(f[],li,);
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
for(int zt=;zt<li;zt++)
f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;
FWT(f[i],li,-);
for(int zt=;zt<li;zt++)
{
if(cnt[zt]!=i)f[i][zt]=;
f[i][zt]=f[i][zt]*h[zt]%mod;
}
if(i!=n)FWT(f[i],li,);
}
printf("%lld\n",f[n][li-]); return ;
}

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=+;
const int fbin=(<<)+_;
const LL mod=;
const LL inv2=mod/+;
LL quick_pow(LL A,int p)
{
LL ret=;
while(p!=)
{
if(p%==)ret=ret*A%mod;
A=A*A%mod;p/=;
}
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=;i<n;i<<=)
for(int j=;j<n;j+=(i<<))
for(int k=;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==-)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=(<<n);
len=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int zt=;zt<li;zt++)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)h[zt]+=w[i],cnt[zt]++;
h[zt]=quick_pow(quick_pow(h[zt],mod-),p); bool bk=true;
memset(du,,sizeof(du));
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=len;i+=)
if( ((<<(a[i].x-))&zt) && ((<<(a[i].y-))&zt) )
du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];
int rt=;
for(int i=;i<=n;i++)
{
if(du[i]%==){bk=false;break;}
if((<<(i-))&zt)
{
if(rt==)rt=findfa(i);
else if(rt!=findfa(i)){bk=false;break;}
}
}
if(bk==false)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)g[cnt[zt]][zt]+=w[i];
g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);
}
} //......pre......... for(int i=;i<=n;i++)FWT(g[i],li,);
f[][]=;FWT(f[],li,);
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
for(int zt=;zt<li;zt++)
f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;
FWT(f[i],li,-);
for(int zt=;zt<li;zt++)
{
if(cnt[zt]!=i)f[i][zt]=;
f[i][zt]=f[i][zt]*h[zt]%mod;
}
if(i!=n)FWT(f[i],li,);
}
printf("%lld\n",f[n][li-]); return ;
}

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=+;
const int fbin=(<<)+_;
const LL mod=;
const LL inv2=mod/+;
LL quick_pow(LL A,int p)
{
LL ret=;
while(p!=)
{
if(p%==)ret=ret*A%mod;
A=A*A%mod;p/=;
}
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=;i<=n;i++)
for(int zt=;zt<li;zt++)
if((<<(i-))&zt)a[zt]=(a[zt]+op*a[zt^(<<i-)]+mod)%mod;
}
int main()
{
int n,li,m,p,x,y;
scanf("%d%d%d",&n,&m,&p); li=(<<n);
len=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int zt=;zt<li;zt++)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)h[zt]+=w[i],cnt[zt]++;
h[zt]=quick_pow(quick_pow(h[zt],mod-),p); bool bk=true;
memset(du,,sizeof(du));
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=len;i+=)
if( ((<<(a[i].x-))&zt) && ((<<(a[i].y-))&zt) )
du[a[i].x]++,du[a[i].y]++,fa[findfa(a[i].x)]=fa[findfa(a[i].y)];
int rt=;
for(int i=;i<=n;i++)
{
if(du[i]%==){bk=false;break;}
if((<<(i-))&zt)
{
if(rt==)rt=findfa(i);
else if(rt!=findfa(i)){bk=false;break;}
}
}
if(bk==false)
{
for(int i=;i<=n;i++)
if((<<(i-))&zt)g[cnt[zt]][zt]+=w[i];
g[cnt[zt]][zt]=quick_pow(g[cnt[zt]][zt],p);
}
} //......pre......... for(int i=;i<=n;i++)FMT(g[i],n,li,);
f[][]=;FMT(f[],n,li,);
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
for(int zt=;zt<li;zt++)
f[i][zt]=(f[i][zt]+f[j][zt]*g[i-j][zt])%mod;
FMT(f[i],n,li,-);
for(int zt=;zt<li;zt++)
{
if(cnt[zt]!=i)f[i][zt]=;
f[i][zt]=f[i][zt]*h[zt]%mod;
}
if(i!=n)FMT(f[i],n,li,);
}
printf("%lld\n",f[n][li-]); return ;
}

loj#2340. 「WC2018」州区划分的更多相关文章

  1. 【LOJ】#2340. 「WC2018」州区划分

    题解 学习一个全世界人都会只有我不会的东西 子集变换! 难道我要把这题当板子讲?等等这题好像是板...WC出板题好刺激啊= = 假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或 ...

  2. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

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

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

  4. @loj - 2339@ 「WC2018」通道

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...

  5. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  6. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  7. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  8. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  9. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

随机推荐

  1. Thread线程的基础知识及常见疑惑点

    引言 相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更 ...

  2. Careercup | Chapter 2

    链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...

  3. PHP运行环境搭建

    说明 我的百度百度云盘里面有apache24,PHP7.0,mysql5.6,如果需要的话可以直接下载: apache的环境我已经配置好了,将其解压到C盘根目录 相应绝对路径为C:\Apache24 ...

  4. this.class.getClassLoader().getResourceAsStream

    this.getClass().getClassLoader().getResource("template");    首先,调用对象的getClass()方法是获得对象当前的类 ...

  5. 【hibernate postgresql】注解@TypeDef/@Enumerated/数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" is of type gender but expression is of type character varying

    数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" ...

  6. 非GUI模式下运行JMeter和远程启动JMeter

    JMeter是一款非常不错的免费开源压力测试工具,越来越多的公司在使用.不过,在使用过程中可能会存在一些问题,比如:GUI模式非常消耗资源,单个客户端测试无法达到目标压力.而使用非 GUI 模式,即命 ...

  7. selector在手机上或浏览器显示各种姿势(虚拟下拉菜单)

    测试机型:小米.华为.苹果 测试浏览器:Chrome.Safari.Firefox 最后的结果就是你搞你的,我搞我的! 我认为这样漂亮,你认为那样漂亮(我认为你们都统一!) 因为项目时间紧,所以直接用 ...

  8. 菜鸟调错(十)——启动Tomcat报错“Unsupported major.minor version xxx ”

    近期项目更新JDK,由之前的1.7更新到1.8. 下载并安装好新的JDK以后,编译.启动Tomcat的时候,报错了.提示:"Unsupported major.minor version x ...

  9. 辛星深入分析vim的自己主动补全功能以及vim的映射

    曾经对于vim的自己主动补全功能,都是须要的时候从网上下载点配置项,然后复制到自己的vimrc上去,自己也不知道是什么意思.结果发现搜索到的非常多自己主动补全的方式都非常另类,有的喜欢在补全大括号的时 ...

  10. 将Ubuntu主文件夹里的中文文件夹名称改成英文

    方法一: 首先修改现有主文件夹下各文件夹名称: Desktop. Documents. Download. Music. Pictures. Public. Templates. Videos …… ...