HDU 6057 Kanade's convolution
题目链接:HDU-6057
题意:
思路:先按照官方题解推导出下面的式子:
现在唯一的问题就是怎么解决[bit(x)-bit(y)=bit(k)]的问题。
我们定义\( F(A,k)_{i}=\left[ bit\left( i\right) =k\right] * A_{i} \),相当于把A、B、C分别按照bit划分成m+1个序列。
有如下公式:
同时我们发现\( C_k=F(C,bit(k)))_k \)。
然后我们就可以搞出来啦!
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL; const LL MAXN=;
const LL MOD=;
LL A[][MAXN],B[][MAXN],C[][MAXN];
LL two[];
LL bit(LL x)
{
LL ret=;
while(x>)
{
if(x&) ret++;
x>>=;
}
return ret;
}
// 快速幂
// 求x^n%mod
// Verified!
LL powMod(LL x,LL n,LL mod)
{
LL res=;
while(n>)
{
if(n&) res=res*x % mod;
x=x*x % mod;
n>>=;
}
return res;
}
LL inv(LL a,LL m)
{
return powMod(a,m-,m);
// return powMod(a,eularPhi(m)-1,m);
}
LL inv2;
void FWT_Xor(LL *A, LL len) {
if (len == ) return;
LL len2 = len >> ;
FWT_Xor(A, len2);
FWT_Xor(A + len2, len2);
for (LL i = ; i < len2; ++i) {
LL x = A[i], y = A[i + len2];
A[i] = (x + y) % MOD;
A[i + len2] = ((((x - y) % MOD) + MOD) % MOD);
}
}
void IFWT_Xor(LL *A, LL len) {
if (len == ) return;
LL len2 = len >> ;
for (LL i = ; i < len2; ++i) {
LL x = A[i], y = A[i + len2];
A[i] = ((x + y) % MOD) * inv2 % MOD;
A[i + len2] = ((((x - y) % MOD) + MOD) % MOD) * inv2 % MOD;
}
IFWT_Xor(A, len2);
IFWT_Xor(A + len2, len2);
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
inv2=inv(,MOD);
memset(A,,sizeof(A));
memset(B,,sizeof(B));
memset(C,,sizeof(C));
two[]=;
for(LL i=;i<;i++) two[i]=two[i-]*%MOD; LL m;
scanf("%lld",&m);
for(LL i=;i<(<<m);i++)
{
LL x;
scanf("%lld",&x);
A[bit(i)][i]=x*two[bit(i)]%MOD;
}
for(LL i=;i<(<<m);i++)
{
LL x;
scanf("%lld",&x);
B[bit(i)][i]=x;
}
for(LL i=;i<=m;i++) FWT_Xor(A[i],(<<m));
for(LL i=;i<=m;i++) FWT_Xor(B[i],(<<m));
for(LL k=;k<=m;k++)
for(LL i=k;i<=m;i++)
for(LL j=;j<(<<m);j++)
C[k][j]=(C[k][j]+A[i-k][j]*B[i][j])%MOD;
for(LL i=;i<=m;i++) IFWT_Xor(C[i],(<<m));
LL ans=,mi=;
for(LL i=;i<(<<m);i++)
{
ans=(ans+C[bit(i)][i]*mi)%MOD;
mi=mi*%MOD;
}
printf("%lld\n",ans);
return ;
}
HDU 6057 Kanade's convolution的更多相关文章
- HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3
/* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...
- HDU 6057 Kanade's convolution(FWT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6057 [题目大意] 有 C[k]=∑_(i&j=k)A[i^j]*B[i|j] 求 Ans ...
- hdu 6057 Kanade's convolution(子集卷积)
题解: 然后就是接下来如何fwt 也就是如何处理bit(x) - bit(y) = bit(k)这个条件. 其实就是子集卷积. 把bit(x)和bit(y)划分成两个集合,然后就是子集卷积的形式. 这 ...
- HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3
思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ] | 2017 Multi-University Training Conte ...
- HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3
/* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...
- hdu 6058 Kanade's sum(模拟链表)
Kanade's sum Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu 6059 Kanade's trio(字典树)
Kanade's trio Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)T ...
- HDU 6058 Kanade's sum 二分,链表
Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...
- HDU - 6058 Kanade's sum
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...
随机推荐
- Fair CodeForces - 987D(巧妙bfs)
题意: 有n个城市 m条边,每条边的权值为1,每个城市生产一种商品(可以相同,一共k种),求出分别从每个城市出发获得s种商品时所走过路的最小权值 解析: 我们倒过来想,不用城市找商品,而是商品找城市, ...
- kickstart无人值守安装之实践篇
1.系统环境准备 涉及的服务有: DHCP服务 TFTP服务 PXE客户端 HTTP服务 [root@ks ~]# cat /etc/redhat-release CentOS release 6.9 ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- java多线程 -- volatile 关键字 内存 可见性
内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其 ...
- bzoj1027【JSOI2007】合金
题目描述 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...
- js子节点children和childnodes的用法
想要获取子节点的数量,有几种办法. childNodes 它会把空的文本节点当成节点, <ul> 文本节点 <li>元素节点</li> 文本节点 <li> ...
- 【Asp.net入门4-01】基本开发工具
- Java入门:练习——自定义通用工具类
请编写一个通用工具类,该类具有如下功能: 1)判断一个字符串是否是邮箱地址 2)判断一个字符串是否是手机号码 3)判断一个字符串是否是电话号码 4)判断一个字符串是否是IP地址 代码结构如下,请补充完 ...
- Java入门:基础算法之检查奇偶性
本程序检查一个数是奇数还是偶数. import java.util.Scanner; class CheckEvenOdd { public static void main(String args[ ...
- ElasticStack系列之十 & 生产中的问题与解决方案
1. 由 gc 引起节点异常 问题: 因为 gc 时会使 jvm 停止工作,如果某个节点 gc 时间过长,master ping 3次(zen discovery默认 ping 失败重试 3 次)不通 ...