题目描述

Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下:
1. Claris和NanoApe两个人轮流拿石子,Claris先拿。
2. 每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。
不同的初始局面,决定了最终的获胜者,有些局面下先拿的Claris会赢,其余的局面Claris会负。
Claris很好奇,如果这n堆石子满足每堆石子的初始数量是不超过m的质数,而且他们都会按照最优策略玩游戏,那么NanoApe能获胜的局面有多少种。
由于答案可能很大,你只需要给出答案对10^9+7取模的值。

输入

输入文件包含多组数据,以EOF为结尾。
对于每组数据:
共一行两个正整数n和m。
每组数据有1<=n<=10^9, 2<=m<=50000。
不超过80组数据。

输出

每组数据输出一个数,表示答案

样例输入

3 7
4 13

样例输出

6
120


题解

FWT裸题

Nim游戏后手必胜条件:每堆石子数异或和为0。

那么设f[i]表示异或和为i的方案数,显然这是一个异或规则下的卷积(卷积求幂)

所以使用FWT,每个数转化后求对应的幂次,再求逆FWT即为答案。

#include <cstdio>
#include <cstring>
#define N 70000
typedef long long ll;
const ll mod = 1000000007 , inv = 500000004;
int np[N] , prime[N] , tot;
ll a[N];
ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
void fwt(int len)
{
int i , j , k;
ll t;
for(i = 2 ; i <= len ; i <<= 1)
for(j = 0 ; j < len ; j += i)
for(k = j ; k < j + (i >> 1) ; k ++ )
t = a[k] , a[k] = (a[k] + a[k + (i >> 1)]) % mod , a[k + (i >> 1)] = (t - a[k + (i >> 1)] + mod) % mod;
}
void ufwt(int len)
{
int i , j , k;
ll t;
for(i = len ; i >= 2 ; i >>= 1)
for(j = 0 ; j < len ; j += i)
for(k = j ; k < j + (i >> 1) ; k ++ )
t = a[k] , a[k] = (a[k] + a[k + (i >> 1)]) * inv % mod , a[k + (i >> 1)] = (t - a[k + (i >> 1)] + mod) * inv % mod;
}
int main()
{
int n , m , i , j , len;
for(i = 2 ; i <= 50000 ; i ++ )
{
if(!np[i]) prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= 50000 ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
while(~scanf("%d%d" , &n , &m))
{
memset(a , 0 , sizeof(a));
for(i = 1 ; i <= tot && prime[i] <= m ; i ++ ) a[prime[i]] = 1;
for(len = 1 ; len <= m ; len <<= 1);
fwt(len);
for(i = 0 ; i < len ; i ++ ) a[i] = pow(a[i] , n);
ufwt(len);
printf("%lld\n" , a[0]);
}
return 0;
}

【bzoj4589】Hard Nim FWT的更多相关文章

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

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

  2. 【BZOJ4589】Hard Nim(FWT)

    题解: 由博弈论可以知道题目等价于求这$n$个数$\^$为0 快速幂$+fwt$ 这样是$nlog^2$的 并不能过 而且得注意$m$的数组$\^$一下会生成$2m$ #include <bit ...

  3. 【CF662A】Gambling Nim 线性基

    [CF662A]Gambling Nim 题意:n长卡牌,第i张卡牌正面的数字是$a_i$,反面的数字是$b_i$,每张卡牌等概率为正面朝上或反面朝上.现在Alice和Bob要用每张卡牌朝上的数字玩N ...

  4. 【BZOJ3105】新Nim游戏(线性基)

    [BZOJ3105]新Nim游戏(线性基) 题面 BZOJ Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以 ...

  5. 【CSU1911】Card Game(FWT)

    [CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...

  6. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

  7. 【CF772D】Varying Kibibits FWT

    [CF772D]Varying Kibibits 题意:定义函数f(a,b,c...)表示将a,b,c..的10进制下的每一位拆开,分别取最小值组成的数.如f(123,321)=121,f(530,  ...

  8. 【CF850E】Random Elections FWT

    [CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...

  9. 【SRM】518 Nim

    题意 \(K(1 \le K \le 10^9)\)堆石子,每堆石子个数不超过\(L(2 \le 50000)\),问Nim游戏中先手必败局面的数量,答案对\(10^9+7\)取模. 分析 容易得到\ ...

随机推荐

  1. js数据结构处理--------扁平化数组处理为树结构数据

    将扁平化的数组处理为树结构数据,我们可以利用对象来处理,对象的复制是浅拷贝,指向相同的内存地址: var arr = [ { id: 0, pid: -1, name: 'sadas' }, { id ...

  2. CUDA编程时,线程块的处理方法

  3. Jquery LigerUI

    http://www.ligerui.com/index.aspx http://api.ligerui.com/ 分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下 ...

  4. gitlab系列详解

    虚拟机的安装1.安装virtualboxhttps://www.virtualbox.org/2.安装centos6.63.配置网络右键-->网络-->网卡2-->host-only ...

  5. c++ question 003 求两数大者?

    #include <iostream>using namespace std; int main(){ //求两数中的大者? int a,b; cin>>a>>b; ...

  6. Vimim是VI中最好的输入法

    Vimim是VI中最好的输入法 由于在VI中,normal和insert模式的存在,如果在insert模式下正在输入中文,在通过ESC键返回到normal模式后,系统的中文输入法会与VI的命令相冲突, ...

  7. PAT 乙级 1078 / 1084

    题目 PAT 乙级 1078 PAT 乙级 1084 题解 1078和1084这两道题放在一块写,主要是因为这两道题的解法和做题思路非常相似:之前我做这一类题没有一个固定的套路,想到哪写到哪,在某种程 ...

  8. Git 内部原理之 Git 对象哈希

    在上一篇文章中,将了数据对象.树对象和提交对象三种Git对象,每种对象会计算出一个hash值.那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题. Git对象的hash方法 ...

  9. 绘制字符串:imagestring()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  10. 04.VUE学习之v-text v-html

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...