BZOJ4589: Hard Nim(FWT 快速幂)
题意
Sol
神仙题Orzzzz
题目可以转化为从\(\leqslant M\)的质数中选出\(N\)个\(xor\)和为\(0\)的方案数
这样就好做多了
设\(f(x) = [x \text{是质数}]\)
\(n\)次异或FWT即可
快速幂优化一下,中间不用IFWT,最后转一次就行(然而并不知道为什么)
哪位大佬教教我这题的DP怎么写呀qwqqqq
死过不过去样例。。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 17) + 10, mod = 998244353, inv2 = 499122177;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, A[MAXN], B[MAXN], C[MAXN];
int add(int x, int y) {
if(x + y < 0) return x + y + mod;
return x + y >= mod ? x + y - mod : x + y;
}
int mul(int x, int y) {
return 1ll * x * y % mod;
}
void FWTor(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++)
if(opt == 1) a[j + k + mid] = add(a[j + k], a[j + k + mid]);
else a[j + k + mid] = add(a[j + k + mid], -a[j + k]);
}
void FWTand(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++)
if(opt == 1) a[j + k] = add(a[j + k], a[j + k + mid]);
else a[j + k] = add(a[j + k], -a[j + k + mid]);
}
void FWTxor(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++) {
int x = a[j + k], y = a[j + k + mid];
if(opt == 1) a[j + k] = add(x, y), a[j + k + mid] = add(x, -y);
else a[j + k] = mul(add(x, y), inv2), a[j + k + mid] = mul(add(x, -y), inv2);
}
}
int main() {
N = 1 << (read());
for(int i = 0; i < N; i++) A[i] = read();
for(int i = 0; i < N; i++) B[i] = read();
FWTor(A, 1); FWTor(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTor(C, -1); FWTor(A, -1); FWTor(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
FWTand(A, 1); FWTand(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTand(C, -1); FWTand(A, -1); FWTand(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
FWTxor(A, 1); FWTxor(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTxor(C, -1); FWTxor(A, -1); FWTxor(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]);
return 0;
}
BZOJ4589: Hard Nim(FWT 快速幂)的更多相关文章
- BZOJ4589 Hard Nim FWT 快速幂 博弈
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...
- 【bzoj4589】Hard Nim FWT+快速幂
题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...
- [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 题意 求选恰好n个数,满足每个数都是不大于m的质数,且它们的异或和为0的方案数. 解法 ...
- 【51Nod1773】A国的贸易 FWT+快速幂
题目描述 给出一个长度为 $2^n$ 的序列,编号从0开始.每次操作后,如果 $i$ 与 $j$ 的二进制表示只差一位则第 $i$ 个数会加上操作前的第 $j$ 个数.求 $t$ 次操作后序列中的每个 ...
- BZOJ4589 Hard Nim(快速沃尔什变换FWT)
这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ ...
- bzoj 4589: Hard Nim【线性筛+FWT+快速幂】
T了两次之后我突然意识到转成fwt形式之后,直接快速幂每次乘一下最后再逆回来即可,并不需要没此次都正反转化一次-- 就是根据nim的性质,先手必输是所有堆个数异或和为0,也就变成了一个裸的板子 #in ...
- bzoj4589: Hard Nim fwt
题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /*************** ...
- BZOJ4589 Hard Nim(快速沃尔什变换模板)
终于抽出时间来学了学,比FFT不知道好写到哪里去. #include <cstdio> typedef long long ll; ,p=1e9+; int k,m,n,a[N],pi[N ...
- BZOJ 4589 Hard Nim(FWT+博弈论+快速幂)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4589 [题目大意] 有n堆石子,每堆都是m以内的质数,请问后手必胜的局面有几种 [题解 ...
随机推荐
- 给对象和函数添加method方法
蝴蝶书中有一个method方法,用来给函数定义方法.看了之后,想着能不能给对象也定义方法呢?. 下面的代码可以实现给函数定义方法: //Function method Function.prototy ...
- CentOS下安装Docker
简介:本篇文章介绍如何在CentOS系统下面安装docker系统. 官方文档:https://docs.docker.com/install/linux/docker-ce/centos/ Docke ...
- 架构师养成记--30.Redis环境搭建
Redis的安装 下载地址http://redis.io/download 安装步骤: 首先需要安装gcc,把下载好的redis-3.0.0-rc2.tar.gz 放到 /usr/local 文件夹下 ...
- 安卓手机移动端Web开发调试之Chrome远程调试(Remote Debugging)
一.让安卓打debug模式的apk包 二.将电脑中的chrome升级到最新版本,在chrome浏览器地址栏中输入chrome://inspect/#devices: 在智能手机还未普及时,移动设备的调 ...
- Mac 10.12安装虚拟机软件VMware Fusion 12
说明:VMware创建的虚拟机是全平台通用的,如果要在Mac下识别,那么在虚拟机的文件夹后面增加后缀[.vmwarevm] 下载: (链接: https://pan.baidu.com/s/1eSLE ...
- (热死你)Resin https ssl Linux 配置,实战可用
(热死你)Resin https ssl Linux 配置,实战可用 一.配置resin 1.在resin服务器中创建目录keys文件和openssl.conf,格式内容如下: #先复制以下的内容: ...
- 创建自己的区块链游戏SLOT——以太坊代币(三)
一个以太坊合约版本的轮盘游戏,向合约转账ETH,有几率获得3,5,10,100倍奖励 合约地址:0x53DA598E70a1505Ad95cBF17fc5DCA0d2c51174b 捐赠ETH地址:0 ...
- interceptor&filter
1.基于 filter基于filter接口中的doFilter回调函数: interceptor则基于Java本身的反射机制: 2.与servlet关系 filter是依赖于servlet容器的,没有 ...
- linux进程间的网络通信
一.进程是如何进行网络通信的?socket通信的过程? 同一机器上的不同进程之间的通信方式有很多种,主要使用消息传递或共享内存.而跨网络的进程是几乎都是使用socket通信,例如web服务器,QQ. ...
- throws 与 throw
摘录自:http://blog.csdn.net/ronawilliam/article/details/3299676 void doA() throws Exception1, Exception ...