题目链接: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 \)。

然后我们就可以搞出来啦!

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. const LL MAXN=;
  9. const LL MOD=;
  10. LL A[][MAXN],B[][MAXN],C[][MAXN];
  11. LL two[];
  12. LL bit(LL x)
  13. {
  14. LL ret=;
  15. while(x>)
  16. {
  17. if(x&) ret++;
  18. x>>=;
  19. }
  20. return ret;
  21. }
  22. // 快速幂
  23. // 求x^n%mod
  24. // Verified!
  25. LL powMod(LL x,LL n,LL mod)
  26. {
  27. LL res=;
  28. while(n>)
  29. {
  30. if(n&) res=res*x % mod;
  31. x=x*x % mod;
  32. n>>=;
  33. }
  34. return res;
  35. }
  36. LL inv(LL a,LL m)
  37. {
  38. return powMod(a,m-,m);
  39. // return powMod(a,eularPhi(m)-1,m);
  40. }
  41. LL inv2;
  42. void FWT_Xor(LL *A, LL len) {
  43. if (len == ) return;
  44. LL len2 = len >> ;
  45. FWT_Xor(A, len2);
  46. FWT_Xor(A + len2, len2);
  47. for (LL i = ; i < len2; ++i) {
  48. LL x = A[i], y = A[i + len2];
  49. A[i] = (x + y) % MOD;
  50. A[i + len2] = ((((x - y) % MOD) + MOD) % MOD);
  51. }
  52. }
  53. void IFWT_Xor(LL *A, LL len) {
  54. if (len == ) return;
  55. LL len2 = len >> ;
  56. for (LL i = ; i < len2; ++i) {
  57. LL x = A[i], y = A[i + len2];
  58. A[i] = ((x + y) % MOD) * inv2 % MOD;
  59. A[i + len2] = ((((x - y) % MOD) + MOD) % MOD) * inv2 % MOD;
  60. }
  61. IFWT_Xor(A, len2);
  62. IFWT_Xor(A + len2, len2);
  63. }
  64. int main()
  65. {
  66. #ifdef LOCAL
  67. freopen("in.txt","r",stdin);
  68. #endif
  69. inv2=inv(,MOD);
  70. memset(A,,sizeof(A));
  71. memset(B,,sizeof(B));
  72. memset(C,,sizeof(C));
  73. two[]=;
  74. for(LL i=;i<;i++) two[i]=two[i-]*%MOD;
  75.  
  76. LL m;
  77. scanf("%lld",&m);
  78. for(LL i=;i<(<<m);i++)
  79. {
  80. LL x;
  81. scanf("%lld",&x);
  82. A[bit(i)][i]=x*two[bit(i)]%MOD;
  83. }
  84. for(LL i=;i<(<<m);i++)
  85. {
  86. LL x;
  87. scanf("%lld",&x);
  88. B[bit(i)][i]=x;
  89. }
  90. for(LL i=;i<=m;i++) FWT_Xor(A[i],(<<m));
  91. for(LL i=;i<=m;i++) FWT_Xor(B[i],(<<m));
  92. for(LL k=;k<=m;k++)
  93. for(LL i=k;i<=m;i++)
  94. for(LL j=;j<(<<m);j++)
  95. C[k][j]=(C[k][j]+A[i-k][j]*B[i][j])%MOD;
  96. for(LL i=;i<=m;i++) IFWT_Xor(C[i],(<<m));
  97. LL ans=,mi=;
  98. for(LL i=;i<(<<m);i++)
  99. {
  100. ans=(ans+C[bit(i)][i]*mi)%MOD;
  101. mi=mi*%MOD;
  102. }
  103. printf("%lld\n",ans);
  104. return ;
  105. }

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. BZOJ 2460: [BeiJing2011]元素

    2460: [BeiJing2011]元素 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 878  Solved: 470[Submit][Statu ...

  2. 【BZOJ2423】最长公共子序列(动态规划)

    [BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...

  3. 20165218 《网络对抗技术》Exp2 后门原理与实践

    Exp2 后门原理与实践 准备工作 1. 查看Linux和Win的IP地址,ping通 Linux地址 Win7地址 ping 2.下载ncat并装载到win7主机 3.下载socat并装载到win7 ...

  4. BAT脚本如何自动执行 adb shell 以后的命令

    @echo off echo su > temp.txt echo 其它命令 >> temp.txt adb shell < temp.txt del temp.txt 求问 ...

  5. Python实现类似JavaScript 的Json对象

    Python实现类似JavaScript 的Json对象 用过js的都知道 js中json也是一个对象,所以可以直接通过class.attr 取值,当attr不存在时也不会报错,那么Python可不可 ...

  6. sql数据库设计学习---数据库设计规范化的五个要求

    http://blog.csdn.net/taijianyu/article/details/5945490 一:表中应该避免可为空的列: 二:表不应该有重复的值或者列: 三: 表中记录应该有一个唯一 ...

  7. java CPU 100% 排查(转载)

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  8. git<commit和分支>

    commit: 在执行提交命令git commit之前,一定要git add要修改的文件,这样才能将更改的内容更新到本地. 在Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内 ...

  9. 用递归的方法求一个数组的前n项和

    用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...

  10. SourceTree使用SSH克隆码云项目

    SourceTree使用SSH克隆码云项目 觉得有用的话,欢迎一起讨论相互学习~Follow Me SourceTree使用SSH克隆码云项目 参考文献 https://blog.csdn.net/q ...