题意

题目链接

Sol

神仙题Orzzzz

题目可以转化为从\(\leqslant M\)的质数中选出\(N\)个\(xor\)和为\(0\)的方案数

这样就好做多了

设\(f(x) = [x \text{是质数}]\)

\(n\)次异或FWT即可

快速幂优化一下,中间不用IFWT,最后转一次就行(然而并不知道为什么)

哪位大佬教教我这题的DP怎么写呀qwqqqq

死过不过去样例。。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = (1 << 17) + 10, mod = 998244353, inv2 = 499122177;
  4. inline int read() {
  5. char c = getchar(); int x = 0, f = 1;
  6. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  7. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  8. return x * f;
  9. }
  10. int N, A[MAXN], B[MAXN], C[MAXN];
  11. int add(int x, int y) {
  12. if(x + y < 0) return x + y + mod;
  13. return x + y >= mod ? x + y - mod : x + y;
  14. }
  15. int mul(int x, int y) {
  16. return 1ll * x * y % mod;
  17. }
  18. void FWTor(int *a, int opt) {
  19. for(int mid = 1; mid < N; mid <<= 1)
  20. for(int R = mid << 1, j = 0; j < N; j += R)
  21. for(int k = 0; k < mid; k++)
  22. if(opt == 1) a[j + k + mid] = add(a[j + k], a[j + k + mid]);
  23. else a[j + k + mid] = add(a[j + k + mid], -a[j + k]);
  24. }
  25. void FWTand(int *a, int opt) {
  26. for(int mid = 1; mid < N; mid <<= 1)
  27. for(int R = mid << 1, j = 0; j < N; j += R)
  28. for(int k = 0; k < mid; k++)
  29. if(opt == 1) a[j + k] = add(a[j + k], a[j + k + mid]);
  30. else a[j + k] = add(a[j + k], -a[j + k + mid]);
  31. }
  32. void FWTxor(int *a, int opt) {
  33. for(int mid = 1; mid < N; mid <<= 1)
  34. for(int R = mid << 1, j = 0; j < N; j += R)
  35. for(int k = 0; k < mid; k++) {
  36. int x = a[j + k], y = a[j + k + mid];
  37. if(opt == 1) a[j + k] = add(x, y), a[j + k + mid] = add(x, -y);
  38. else a[j + k] = mul(add(x, y), inv2), a[j + k + mid] = mul(add(x, -y), inv2);
  39. }
  40. }
  41. int main() {
  42. N = 1 << (read());
  43. for(int i = 0; i < N; i++) A[i] = read();
  44. for(int i = 0; i < N; i++) B[i] = read();
  45. FWTor(A, 1); FWTor(B, 1);
  46. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  47. FWTor(C, -1); FWTor(A, -1); FWTor(B, -1);
  48. for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
  49. FWTand(A, 1); FWTand(B, 1);
  50. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  51. FWTand(C, -1); FWTand(A, -1); FWTand(B, -1);
  52. for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
  53. FWTxor(A, 1); FWTxor(B, 1);
  54. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  55. FWTxor(C, -1); FWTxor(A, -1); FWTxor(B, -1);
  56. for(int i = 0; i < N; i++) printf("%d ", C[i]);
  57. return 0;
  58. }

BZOJ4589: Hard Nim(FWT 快速幂)的更多相关文章

  1. BZOJ4589 Hard Nim FWT 快速幂 博弈

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...

  2. 【bzoj4589】Hard Nim FWT+快速幂

    题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...

  3. [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)

    题面:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 题意 求选恰好n个数,满足每个数都是不大于m的质数,且它们的异或和为0的方案数. 解法 ...

  4. 【51Nod1773】A国的贸易 FWT+快速幂

    题目描述 给出一个长度为 $2^n$ 的序列,编号从0开始.每次操作后,如果 $i$ 与 $j$ 的二进制表示只差一位则第 $i$ 个数会加上操作前的第 $j$ 个数.求 $t$ 次操作后序列中的每个 ...

  5. BZOJ4589 Hard Nim(快速沃尔什变换FWT)

    这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ ...

  6. bzoj 4589: Hard Nim【线性筛+FWT+快速幂】

    T了两次之后我突然意识到转成fwt形式之后,直接快速幂每次乘一下最后再逆回来即可,并不需要没此次都正反转化一次-- 就是根据nim的性质,先手必输是所有堆个数异或和为0,也就变成了一个裸的板子 #in ...

  7. bzoj4589: Hard Nim fwt

    题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /*************** ...

  8. BZOJ4589 Hard Nim(快速沃尔什变换模板)

    终于抽出时间来学了学,比FFT不知道好写到哪里去. #include <cstdio> typedef long long ll; ,p=1e9+; int k,m,n,a[N],pi[N ...

  9. BZOJ 4589 Hard Nim(FWT+博弈论+快速幂)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4589 [题目大意] 有n堆石子,每堆都是m以内的质数,请问后手必胜的局面有几种 [题解 ...

随机推荐

  1. Java初学者的学习路线建议

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  2. SPI 用户空间的读写操作

    spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它.在内核中 ...

  3. js 的概念和声明-js 的变量-js 的运算符和逻辑结构-js 的数组

    js 的概念和声明Js的概念和声明:问题:在网页的发展历程中,发现网页不能对用户的数据进行自动校验,和提供一些特效造成用户体验极差解决:使用JavaScript作用:可以让网页和用户之间进行直接简单的 ...

  4. Python数据类型之数字

    数字(数值) 整数 :123 (int型) 浮点数: 0.25(带小数点的数字即为浮点数,Float型) 布尔值:False,True(即0和1,bool型) 复数 (暂无资料,complex型) 整 ...

  5. ui4-5

    2016PS第4-5周 图像的高级编辑方法: 4-1.用变换将照片放入相框 1.打开素材文件01-1.jpg 2.执行:文件/置入,选素材01-2.jpg 3.执行:编辑/变换/缩放,缩小照片,暂不退 ...

  6. BZOJ AC 300祭!

  7. 状态机模式中的Task与对象池

    Task 抽象带来Task 首先,假设我们有这么一段逻辑:收到一个参数,先校验格式是否正确,再提取相关的参数出来,执行我们的事务,然后构建结果并返回.伪代码如下: /** * 一个engine类 ** ...

  8. 线段树基本操作(Segment Tree)

    线段树(Segment Tree) 入门模板题 洛谷oj P3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包 ...

  9. Sublime Text 3插件收集

    0.Package Control 这个是必须装的,就不多解释了 1.ConvertToUTF8 支持 GBK, BIG5, EUC-KR, EUC-JP, Shift_JIS 等编码的插件. 2.B ...

  10. spring boot快速入门 2 :属性配置

    属性配置:在application.properties中配置 第一步:配置端口号和项目名 并启动 第二步:在浏览器查看请求 第二种配置方式: 在application.yml中配置.(较为常用) 注 ...