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的位置, ...
随机推荐
- BZOJ 2460: [BeiJing2011]元素
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 878 Solved: 470[Submit][Statu ...
- 【BZOJ2423】最长公共子序列(动态规划)
[BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...
- 20165218 《网络对抗技术》Exp2 后门原理与实践
Exp2 后门原理与实践 准备工作 1. 查看Linux和Win的IP地址,ping通 Linux地址 Win7地址 ping 2.下载ncat并装载到win7主机 3.下载socat并装载到win7 ...
- BAT脚本如何自动执行 adb shell 以后的命令
@echo off echo su > temp.txt echo 其它命令 >> temp.txt adb shell < temp.txt del temp.txt 求问 ...
- Python实现类似JavaScript 的Json对象
Python实现类似JavaScript 的Json对象 用过js的都知道 js中json也是一个对象,所以可以直接通过class.attr 取值,当attr不存在时也不会报错,那么Python可不可 ...
- sql数据库设计学习---数据库设计规范化的五个要求
http://blog.csdn.net/taijianyu/article/details/5945490 一:表中应该避免可为空的列: 二:表不应该有重复的值或者列: 三: 表中记录应该有一个唯一 ...
- java CPU 100% 排查(转载)
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...
- git<commit和分支>
commit: 在执行提交命令git commit之前,一定要git add要修改的文件,这样才能将更改的内容更新到本地. 在Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内 ...
- 用递归的方法求一个数组的前n项和
用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...
- SourceTree使用SSH克隆码云项目
SourceTree使用SSH克隆码云项目 觉得有用的话,欢迎一起讨论相互学习~Follow Me SourceTree使用SSH克隆码云项目 参考文献 https://blog.csdn.net/q ...