题目链接  Hard Nim

设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数

那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数。

这个$DP$太暴力了。让我们冷静分析。

设不大于m的质数从小到大分别为$c_{1}$, $c_{2}$, ..., $c_{k}$

$f[i][j] = ∑f[i-1][j$ $\hat{}$ $c[k]]$, 我们令$g[c[i]]$为$1$,其余为$0$。

$f[i][j] = ∑f[i-1][j$ $\hat{}$ $k] * g[k]$

我们发现后边其实就是一个异或卷积的形式。

于是就可以$FWT$了。

但是左边那一维还是巨大……

我们可以发现这个多项式乘法是满足结合律的

于是在做逆变换之前的那个乘法的时候直接快速幂即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const LL mod = 1e9 + 7;
const LL rev = (mod + 1) >> 1; int n, m;
int l;
int tot = 0;
int p[1 << 20];
LL a[1 << 20], b[1 << 20], g[1 << 20]; void pre(){
rep(i, 2, 5e4){
if (!g[i]) p[++tot] = i;
for (int j = 1; j <= tot && i * p[j] <= 5e4; ++j){
g[i * p[j]] = 1;
if (i % p[j] == 0) break;
}
}
} void FWT(LL *a, int n){
for (int d = 1; d < n; d <<= 1)
for (int m = d << 1, i = 0; i < n; i += m)
for (int j = 0; j < d; j++){
LL x = a[i + j], y = a[i + j + d];
a[i + j] = (x + y) % mod, a[i + j + d] = (x - y + mod) % mod; }
} void UFWT(LL *a, int n){
for (int d = 1; d < n; d <<= 1)
for (int m = d << 1, i = 0; i < n; i += m)
for (int j = 0; j < d; j++){
LL x = a[i + j], y = a[i + j + d];
a[i + j] = 1LL * (x + y) * rev % mod, a[i + j + d] = (1LL * (x - y) * rev % mod + mod) % mod;
}
} void solve(LL *a, LL *b, int n, int p){
a[0] = 1;
FWT(a, n);
FWT(b, n);
while (p){
if (p & 1){
rep(i, 0, n - 1) (a[i] *= b[i]) %= mod;
} rep(i, 0, n - 1) (b[i] *= b[i]) %= mod;
p >>= 1;
} UFWT(a, n);
} int main(){ pre(); while (~scanf("%d%d", &n, &m)){
for (l = 1; l <= m; l <<= 1){;} memset(a, 0, sizeof a);
memset(b, 0, sizeof b); for (int i = 1; i <= tot && p[i] <= m; ++i){
b[p[i]] = 1;
} solve(a, b, l, n);
printf("%lld\n", a[0]);
} return 0;
}

  

BZOJ 4589 Hard Nim(FWT加速DP)的更多相关文章

  1. bzoj 4589 Hard Nim——FWT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 一开始异或和为0的话先手必败.有 n 堆,每堆可以填那些数,求最后异或和为0的方案数, ...

  2. bzoj 4589 Hard Nim —— FWT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 先手必败,是一开始所有石子的异或和为0: 生成函数 (xpri[1] + xpri[2 ...

  3. BZOJ.4589.Hard Nim(FWT)

    题目链接 FWT 题意即,从所有小于\(m\)的质数中,选出\(n\)个数,使它们异或和为\(0\)的方案数. 令\(G(x)=[x是质数]\),其实就是对\(G(x)\)做\(n\)次异或卷积后得到 ...

  4. BZOJ 4589 Hard Nim ——FWT

    [题目分析] 位运算下的卷积问题. FWT直接做. 但还是不太民白,发明者要承担泽任的. [代码] #include <cstdio> #include <cstring> # ...

  5. FWT [BZOJ 4589:Hard Nim]

    4589: Hard Nim Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 152[Submit][Status][Disc ...

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

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

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

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

  8. [BZOJ 4589]Hard Nim

    Description 题库链接 两人玩 \(nim\) 游戏,\(n\) 堆石子,每堆石子初始数量是不超过 \(m\) 的质数,那么后手必胜的方案有多少种.对 \(10^9+7\) 取模. \(1\ ...

  9. bzoj 4347 [POI2016]Nim z utrudnieniem DP

    4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 733  Solved: 281[Su ...

随机推荐

  1. 剑指Offer - 九度1507 - 不用加减乘除做加法

    剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包 ...

  2. 《Cracking the Coding Interview》——第17章:普通题——题目14

    2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. ...

  3. 图解-Excel的csv格式特殊字符处理方式尝试笔记(个人拙笔)

    Excel格式如下.(截图来自,WPS Office) CSV是一种文本格式的Excel文档格式.不支持Excel的字体特效(比如加粗,颜色)等等的保存. 每一行数据用 "\n" ...

  4. day06_02 元组

    1.0 元组 元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组.元素卸载小括号(())里,元素之间用逗号隔开. tup1 = () #空元组 tup2 = (20 ...

  5. HDU 4763 Theme Section ( KMP next函数应用 )

    设串为str, 串长为len. 对整个串求一遍next函数,从串结尾开始顺着next函数往前找<=len/3的最长串,假设串长为ans,由于next的性质,所以找到的串肯定满足E……E这种形式, ...

  6. Pandas根据条件赋值

    我们有以下判断条件,我们想要更改B中的数, 而更改的位置是取决于 A 的. 对于A大于4的位置. 更改B在相应位置上的数为0. df.B[df.A>4] = 0

  7. nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

    nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来 ...

  8. winform中key读取修改

    根据key name的名称读取value-----读取使用ConfigurationManager.AppSettings读取容易没读取到根目录中的key public string GetXml(s ...

  9. PotPlayer一款简洁好用的播放器

    PotPlayer 是 KMPlayer 的原制作者姜龙喜先生(韩国)进入 Daum 公司后的新一代作品.PotPlayer 的优势在于强大的内置解码器:而 KMPlayer 的优势在于强大的定制能力 ...

  10. 优化web前端性能的几个方法

    1 减少http请求, a. 合并脚本跟样式文件,如可以把多个 CSS 文件合成一个,把多个 JS 文件合成一个. b. CSS Sprites 利用 CSS background 相关元素进行背景图 ...