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的位置, ...
随机推荐
- Android proguard-rules.pro 混淆模板
在../sdk/tools/proguard/目录下,其中包含了android最基本的混淆 ..\proguard-rules.pro 混淆文件配置模板: ############# 混淆模板 ## ...
- [USACO18OPEN]Out of Sorts P 冒泡排序理解之二
题目描述 Bessie把快速排序和冒泡排序混在了一起 给一个伪快排的代码: 冒泡: bubble_sort_pass (A) { to length(A)- ], swap A[i] and A[i+ ...
- MySQL 第六篇:数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1O8hXkdRK5_EVHZwNPwjCB ...
- nginx访问日志出现大量的500状态信息,用postman返回 Internal Server Error,Too Many Attempts.错误的解决办法
用postman的post方法访问某个URL时,出现以下错误: { "status": "1", "message": " Int ...
- No module named 'urllib.request'; 'urllib' is not a package
想学爬虫urllib的设置代理服务器,于是把之前跳过没学的urllib捡起来,敲了段简单的代码,如下 import urllib.request url = "http://www.baid ...
- P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...
- python中__init__()、__new__()、__call__()、__del__()用法
关于__new__()的用法参考: http://www.myhack58.com/Article/68/2014/48183.htm 正文: 一.__new__()的用法: __new__()是在新 ...
- python中几种常用的数据类型
1.字典 字典的创建: dict1=dict((('name','PIG'),)),其中第一层()代表里面的内容是dict函数的输入参数.第二层和第三层代表字典中的各元素,也就是key和value组合 ...
- Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法
Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. fs.listFiles方法,返回Loc ...
- C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...