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=+;
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」州区划分的更多相关文章
- 【LOJ】#2340. 「WC2018」州区划分
题解 学习一个全世界人都会只有我不会的东西 子集变换! 难道我要把这题当板子讲?等等这题好像是板...WC出板题好刺激啊= = 假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或 ...
- 「WC2018」州区划分(FWT)
「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...
- LOJ 2339 「WC2018」通道——边分治+虚树
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...
- @loj - 2339@ 「WC2018」通道
目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3042. 「ZJOI2019」麻将
Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...
- Loj #2570. 「ZJOI2017」线段树
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
随机推荐
- 【spring data jpa】repository中使用@Query注解使用hql查询,使用@Param引用参数,报错:For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on
在spring boot中, repository中使用@Query注解使用hql查询,使用@Param引用参数 如题报错: For queries with named parameters you ...
- 自己封装的CMusic类 【转】
http://www.cnblogs.com/zhangminaxiang/archive/2013/02/27/2936011.html 缘由: 在改正俄罗斯方块程序的功能的时候,想给这个程序增加一 ...
- Raid分类说明 (from mongodb权威指南)
RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列,旧称Redundant Array of InexpensiveDisk,廉价磁盘冗余阵列) 是一种 ...
- Mysql5.6审计功能
1. 前言 为了安全和操作的可追溯性考虑,越来越多的公司增加了审计功能.mysql5.5推出了相关的审计功能,到5.6.20功能进一步完好.算是勉强可用了.尽管细粒度方面做的不是太好. ...
- Solidworks输出Autocad的DWG格式乱码怎么办
Solidworks输出DWG会有很多问题,如果没必要就别这么做,比如你只是想要打印图纸,Solidworks也可以直接打印,而且很方便,不需要转成DWG再打印,如果对方确实需要DWG格式的图纸,你只 ...
- Odoo MRP 实际成本
Odoo MRP 8 对于 产成品并不支持 实际成本记账 本人开发了一个模块,支持此特性, 可以在 淘宝店铺 购买 https://item.taobao.com/item.htm?_u=85jr9d ...
- python(16)- python内置函数
python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:https://docs.python.org/3/library/functions.html Buil ...
- 批量杀死mysql进程
http://www.chengyongxu.com/blog/%E6%89%B9%E9%87%8F%E6%9D%80%E6%AD%BBmysql%E8%BF%9B%E7%A8%8B/
- hdu4455 dp
pid=4455">http://acm.hdu.edu.cn/showproblem.php?pid=4455 Substrings Time Limit: 10000/5000 M ...
- Django-celery分布式任务
昨天一个很好的面试官问我你在python中怎么实现定时任务呢?我没回答好,我问了下原来有个叫celery的东西,感觉挺好用的 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它 ...