题目链接: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. Linux内核分析实验五

    一.给MenuOS增加time和time-asm命令 1. 克隆并自动编译MenuOS rm menu -rf 强制删除原menu文件 git clone http: cd menumake root ...

  2. 封装个StringBuffer,用array join的方式拼接字符串

    (function(window) { var core_ArrPro = Array.prototype; var core_slice = core_ArrPro.slice; var core_ ...

  3. JsonTools

    public class JsonTools { /// <summary> /// Generate Json string from the object /// </summa ...

  4. GoLand语言快捷键

    快捷键 作用 备注 ctrl + n 导航到类名 ctrl + shift + n 导航到文件 ctrl + e/ctrl + shift + e 打开到最近的文件/打开最近修改的文件 ctrl + ...

  5. QT 菜单资源设置

    版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!   导语        在前一篇中我们学习了使用资源文件为主窗口添加菜单图标.这次,我们 ...

  6. Codeforces Round #302 (Div. 2) C 简单dp

    C. Writing Code time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...

  7. RabbitMQ 运转流程

    生产者发送消息 1.生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel) 2.生产者声明一个交换器,并设置相关属性,比如交换机类型.是否持 ...

  8. 【题解】Tree-String Problem Codeforces 291E AC自动机

    Prelude 传送到Codeforces:(/ω\)--- (/ω•\) Solution 很水的一道题. 对查询的串建出来AC自动机,然后树上随便跑跑就行了. 为什么要写这篇题解呢? 我第一眼看到 ...

  9. HDU 6006 状压dp

    Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. Docker入门与应用系列(一)介绍和部署

    Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...