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 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
随机推荐
- 网站robots.txt探测工具Parsero
网站robots.txt探测工具Parsero robots.txt文件是网站根目录下的一个文本文件.robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当搜索引擎访问一个站点时,它 ...
- Springboot 集成 Thymeleaf 及常见错误
Thymeleaf模板引擎是springboot中默认配置,与freemarker相似,可以完全取代jsp,在springboot中,它的默认路径是src/main/resources/templat ...
- servlet跳转页面后图片不显示
我是用图片的相对路径,原先直接打开jsp的话图片是可以正常显示的,通过servlet跳转之后图片就显示不出来了 后来发现是图片路径的问题, 我是将图片放在WebRoot里面自己创建的img中,原先图片 ...
- 品质与合身 无须昂贵 | Tailorwoods在线男装定制
品质与合身 无须昂贵 | Tailorwoods在线男装定制 北京市朝阳区姚家园北一路八月照相馆2F
- serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID
转载:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVer ...
- C语言-多重背包问题
多重背包问题 问题:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 分 ...
- Leetcode题解(4):L216/Combination Sum III
L216: Combination Sum III Find all possible combinations of k numbers that add up to a number n, giv ...
- hdu5318 The Goddess Of The Moon (矩阵高速幂优化dp)
题目:pid=5318">http://acm.hdu.edu.cn/showproblem.php?pid=5318 题意:给定n个数字串和整数m,规定若数字串s1的后缀和数字串s2 ...
- 关于global和$GLOBALS[]的一道经典面试题
在不执行程序的情况下,你觉得的输出结果是什么? <?php $var1 = 1; $var2 = 2; function test(){ global $var1,$var2; $var2 = ...
- kubernetes集群管理之通过jq来截取属性
系列目录 首先要声明,这里的jq并不是批前端框架里的jquery,而是一个处理json的命令行工具. jq工具相比yq,它更加成熟,功能也更加强大,主要表现在以下几个方面 支持递归查找(我点对我们平时 ...