题目链接: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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. hdu 6057 Kanade's convolution(子集卷积)

    题解: 然后就是接下来如何fwt 也就是如何处理bit(x) - bit(y) = bit(k)这个条件. 其实就是子集卷积. 把bit(x)和bit(y)划分成两个集合,然后就是子集卷积的形式. 这 ...

  4. HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3

    思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Conte ...

  5. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  6. hdu 6058 Kanade's sum(模拟链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  7. hdu 6059 Kanade's trio(字典树)

    Kanade's trio Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  8. 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 ...

  9. HDU - 6058 Kanade's sum

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...

随机推荐

  1. Spring点滴二:Spring Bean

    Spring Bean: 被称作bean的对象是构成应用程序的支柱,是由Spring Ioc容器管理.bean是一个被实例化,配置.组装并由Spring Ioc容器管理对象. 官网API:A Spri ...

  2. BZOJ 2251: [2010Beijing Wc]外星联络

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][ ...

  3. 【BZOJ1041】圆上的整点(数论)

    [BZOJ1041]圆上的整点(数论) 题面 BZOJ 洛谷 题解 好神仙的题目啊. 安利一个视频,大概是第\(7\)到\(19\)分钟的样子 因为要质因数分解,所以复习了一下\(Pollard\_r ...

  4. 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

    [CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...

  5. CF321E Ciel and Gondolas 【决策单调性dp】

    题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...

  6. 洛谷 P1685 游览 解题报告

    P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...

  7. IDA error of " positive sp value has been found"

    问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有? 答:endp ; sp-analysis fai ...

  8. opncv视频资料

    链接: http://pan.baidu.com/s/1i37nXSL 密码: 3xnd这一套opncv资料包括视频和pdf资料

  9. centos install python3 pip3

    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-dev ...

  10. ribbion的负载均衡之端口的切换

    可以说在这里被坑了很久,终于今天在大神的指导下,成功实现了负载均衡,切换不同的端口,这里来记录下,首先来看下效果图吧: 到底是怎么实现的呢?到底是如何切换的呢? 具体来讲: 几个步骤,启动服务注册中心 ...