BZOJ4589. Hard Nim

题意:

Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下:

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

题解:

首先要知道nim先手获胜条件是所有堆的数量异或为0
那么问题就抽象为:n个数,每个数取值范围是[2,m]中的质数,可以取重,问一共有多少种方案,使得这n个数异或为0
对于每一个2~m的质数p,我们都可以取,用数组b来存就是b[p]=1,质数都被标记为1
CkC_kCk​表示异或和为k的方案数有多少种,b[i]=1说明第i位是质数,否则不是
有:Ck=∑i1⊕i2⊕.....⊕in=kbi1×bi2×....×binC_k=\sum_{i_1⊕i_2⊕.....⊕i_n=k}b_{i_1}×b_{i_2}×....×b_{i_n}Ck​=∑i1​⊕i2​⊕.....⊕in​=k​bi1​​×bi2​​×....×bin​​
因为我们要求异或和为0,所以k等于0
式子就是:
求n个序列,其中i1⊕i2⊕.....⊕in=0i_1⊕i_2⊕.....⊕i_n=0i1​⊕i2​⊕.....⊕in​=0
C0=∑i1⊕i2⊕.....⊕in=0bi1×bi2×....×binC_0=\sum_{i_1⊕i_2⊕.....⊕i_n=0}b_{i_1}×b_{i_2}×....×b_{i_n}C0​=∑i1​⊕i2​⊕.....⊕in​=0​bi1​​×bi2​​×....×bin​​
很明显这就是FWT能解决的问题
但是本题中n很大,n<=1e9,如果直接乘一定会超时,我们仔细观察,这个式子就是n个b序列,而所有b序列都是一样的,相当于其实是n个b相乘,也就是bnb^nbn,所以可以通过快速相乘,结合FWT模板理解一下就懂了

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
typedef int itn;
typedef pair<int, int>PII;
const int N = 5e5 + 7, mod = 1e9 + 7;
const double PI = acos(-1.0);int n, m, limit, t;
int a[N], b[N];
bool vis[N];
int primes[N], cnt;int qpow(int a, int b)
{int res = 1;while(b) {if(b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}int inv2 = qpow(2, mod - 2);void init(int n)
{for(int i = 2; i <= n; ++ i) {if(vis[i] == 0) primes[ ++ cnt] = i;for(int j = 1; j <= cnt && i * primes[j] <= n; ++ j) {vis[i * primes[j]] = true;if(i % primes[j] == 0) break;}}
}void XOR(int *a, int n, int type = 1)
{for(int o = 2; o <= n; o <<= 1) {for(int i = 0, k = o >> 1; i < n; i += o) {for(int j = 0; j < k; ++j) {int X = a[i + j];int Y = a[i + j + k];a[i + j] = (1ll * X + Y) % mod;a[i + j + k] = ((1ll * X - Y) % mod + mod) % mod;if(type == -1) {a[i + j] = (1ll * a[i + j] * inv2) % mod;a[i + j + k] = (1ll * a[i + j + k] * inv2) % mod;}}}}
}void solve()
{memset(b, 0, sizeof b);memset(a, 0, sizeof a);for(int i = 2; i <= m; ++ i)if(vis[i] == 0) b[i] = 1;limit = 1;while(limit <= m) limit <<= 1;XOR(b, limit);
//    for(int i=0;i<=limit;i++){//      cout<<"a[i]="<<a[i]<<endl;
//  }
//  for(int i=0;i<=limit;i++){//      cout<<"b[i]="<<b[i]<<endl;
//  }for(int i = 0; i <= limit; ++ i) {b[i] = 1ll * qpow(b[i], n) % mod;}XOR(b, limit, -1);printf("%d\n", b[0]);return ;
}int main()
{//  freopen("data.in", "r", stdin);init(N - 7);while(scanf("%d%d", &n, &m) != EOF) {solve();}
}

BZOJ4589. Hard Nim相关推荐

  1. bzoj4589 Hard Nim

    http://www.lydsy.com/JudgeOnline/problem.php?id=4589 题意:石子堆数为N且每堆石子的数量都是不大于M的质数的Nim游戏,求先手必败的局面数量模10^ ...

  2. BZOJ4589: Hard Nim(FWT 快速幂)

    题意 题目链接 Sol 神仙题Orzzzz 题目可以转化为从\(\leqslant M\)的质数中选出\(N\)个\(xor\)和为\(0\)的方案数 这样就好做多了 设\(f(x) = [x \te ...

  3. bzoj4589: Hard Nim

    传送门 不难看出就是求\(n\)个小于\(m\)的质数异或和为\(0\)的方案数,可以用\(FWT\)+快速幂解决 (我的代码跑了4500ms--不是很明白那几位52ms的巨巨是怎么做到的--可能是我 ...

  4. FFT/NTT/FMT/FWT题目

    快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order S ...

  5. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  6. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  7. 【bzoj3150】 cqoi2013—新Nim游戏

    www.lydsy.com/JudgeOnline/problem.php?id=3105 (题目链接) 题意 在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿 ...

  8. LeetCode实战:Nim 游戏

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 You are pla ...

  9. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

最新文章

  1. 利用Kafka和Cassandra构建实时异常检测实验
  2. linux 内核函数 copy_from_user和copy_to_user 介绍
  3. [转]机器学习和深度学习资料汇总【01】
  4. android 减少图片出现oom错误
  5. 以下python注释代码格式正确的是_Python文件头注释的含义,你肯定不懂
  6. 为什么每个理发店门口都有彩色的柱子?你不知道吧
  7. 【noip2011】【codevs1137】计算系数
  8. iphone 如何卸载xcode4.2
  9. 调洪演算双辅助线法程序(源代码),首次公开!
  10. 【Android多线程】哲学家就餐问题
  11. 初创企业购买企业邮箱_应用创意可为2019年及以后的初创企业带来收入
  12. 基于SSH开发装修软装设计与销售系统
  13. 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代
  14. Parameter 参数与 Argument 参数
  15. 中大计算机考研复试刷人太狠,为何考研初试分数很高的人在复试中被刷?这4个致命失误你犯了?...
  16. 8*8点阵动态显示 I 爱 U
  17. C语言例题:用星号输出棱形图案。
  18. 1.3RK3288积累之命令1
  19. An Casual Overview of Reinforcement Learning
  20. Python爬虫实战之:快代理搭建IP代理池(简版)

热门文章

  1. 堪称经典!这部由苏联最杰出数学家编写的数学教材,为何能大受推崇?
  2. 想象中的同居生活 VS 真实的同居生活
  3. 除了PS,还有它可以轻松实现图像处理!
  4. 表白和被表白时遇到的骚操作,最后一个天秀!| 今日最佳
  5. 手把手教你java快速过滤关键词
  6. 楚乔传手游 服务器维护,楚乔传手游网络异常进不去游戏怎么办?楚乔传网络异常解决方法...
  7. 地线与接地螺丝_电气接地规范与接地的各项参数
  8. java的scanner的方法_Java Scanner reset()方法
  9. leetcode19. 删除链表的倒数第 N 个结点
  10. JVM笔记详解之垃圾回收器