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. BZOJ3751 NOIP2014 解方程(Hash)

    题目链接  BZOJ3751 这道题的关键就是选取取模的质数. 我选了4个大概几万的质数,这样刚好不会T 然后统计答案的时候如果对于当前质数,产生了一个解. 那么对于那些对这个质数取模结果为这个数的数 ...

  2. android 什么时候call super.onDestory()等

    Methods you override that are part of component creation (onCreate(), onStart(), onResume(), etc.), ...

  3. [CQOI2018] 社交网络

    题目背景 当今社会,在社交网络上看朋友的消息已经成为许多人生活的一部分.通常,一个用户在社交网络上发布一条消息(例如微博.状态.Tweet等) 后,他的好友们也可以看见这条消息,并可能转发.转发的消息 ...

  4. Laravel composer自定义命令空间,方便引用第三方库

    第一步:自定义目录 在app文件夹下新建Library目录,做为第三方库的目录 第二步: 修改composer.json文件 autoload节点下的psr-4自定义命名空间 规则: key: 命名空 ...

  5. Parallel Database for OLTP and OLAP

    Parallel Database for OLTP and OLAP Just asurvey article on materials on parallel database products ...

  6. win7 32位安装pyqt

    参考 http://blog.csdn.net/fairyeye/article/details/6607981 http://www.cnblogs.com/toSeek/p/6363036.htm ...

  7. 百科知识 epub文件如何打开

    .epub 简介 EPub是一个自由的开放标准,属于一种可以"自动重新编排"的内容:也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示.EPub档案内部使用了XHTML或 ...

  8. codeforces 553 D Nudist Beach

    题意大概是.给出一个图,保证每一个点至少有一条边以及随意两点间最多一条边.非常显然这个图有众多点集,若我们给每一个点定义一个权值,那每一个点集都有一个最小权值点,如今要求出一个点集,这个点集的最小权值 ...

  9. matplotlib简易新手教程及动画

    做数据分析,首先是要熟悉和理解数据.所以掌握一个趁手的可视化工具是很重要的,否则对数据连个主要的感性认识都没有,怎样进行下一步的design 点击打开链接 还有一个非常棒的资料  Matplotlib ...

  10. mysql freeing items 状态

    http://blog.sina.com.cn/s/blog_6128a8f00100wsdd.html数据库出现大量的freeing items状态 表更新慢 而且大量锁表查看mysql官方free ...