博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj4589】Hard Nim FWT
阅读量:5093 次
发布时间:2019-06-13

本文共 1858 字,大约阅读时间需要 6 分钟。

题目描述

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 
#include
#define N 70000typedef 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;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7413020.html

你可能感兴趣的文章
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
测试计划
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>