[Project Euler 409] Nim Extreme 解题报告 (统计方案数)
题目链接:https://projecteuler.net/problem=409
题目:


题解:
题目问你必胜态的数目,我们考虑用总的方案数减去必败态的方案数(NIM游戏没有平局这个操作)
必败态的方案数就是让我们构造一个长度为n的数列,要求没有重复的数,每一数的值在[1,$2^n-1$]之间,且所有数异或和为0(这个就不需要证明了吧,不过我以前的一篇取石子的博客里好像有证明)
设$f[n]$表示长度为$n$的这样的数列的方案数
显然$f[1]=f[2]=0$
考虑对于$f[i]$怎么转移,设$m=i-1$,$f[i]=(2^i-1)*(2^i-2)*...*(2^i-m)-f[i-1]-f[i-2]*(i-1)*(2^i-m)$
为什么呢?我们知道在已经确定前n-1个数的情况下,第n个数的取值一定是固定的,前n-1个数不相等的方案数是$(2^i-1)*(2^i-2)*...*(2^i-m)$
现在显然是有重复的情况,第一种,第$i$个数等于$0$,我们在总方案数里减去$f[i-1]$
第二种,第$i$个数在之前出现过了,总方案数减去$f[i-2]*(i-1)*(2^i-m)$
主要对第二种的减掉的方案数进行说明,我们其实现在减掉的方案数就是构建一个长度为$i$的,最后一位和之前有重复的数列,考虑我们先得到$i-2$个元素的异或和为$0$且元素互不重复的数列,然后我们在这个数列的基础上加上两个一样的数。因为总方案数前$i-1$个数不重复,这个一样的数显然有$(2^i-m)$种取值,然后我们还要考虑一下两个一样的数除了一个在最后一个位置外另一个在的位置,位置有$i-1$种取法($i-2+1=i-1$)
标程如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll; const ll N=1e7+;
const ll mod=1e9+;
ll n,s,now;
ll f[N];
ll qpow(ll a,ll b,ll mo)
{
ll res=;
for (;b;a=a*a%mo,b>>=) if (b&) res=res*a%mo;
return res;
}
int main()
{
n=1e7;
s=qpow(,n,mod);
f[]=;f[]=;
now=s-;
for (int i=;i<=n;i++)
{
int m=i-;
now=now*(s-m+mod)%mod;
f[i]=now;
f[i]=(f[i]-f[i-])%mod;
f[i]=(f[i]-f[i-]*(i-)%mod*(s-m)%mod)%mod;
//printf("%lld %lld %lld\n",now,f[i-1],f[i-2]*(i-1)*(s-m+1)%mod);
//printf("%d %lld\n",i,f[i]);
}
printf("%lld\n",(now*(s-n)%mod-f[n]%mod)%mod);
return ;
}
[Project Euler 409] Nim Extreme 解题报告 (统计方案数)的更多相关文章
- 【NOIP模拟赛】chess 建图+spfa统计方案数
似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...
- Python练习题 045:Project Euler 017:数字英文表达的字符数累加
本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...
- Python练习题 030:Project Euler 002:偶数斐波那契数之和
本题来自 Project Euler 第2题:https://projecteuler.net/problem=2 # Each new term in the Fibonacci sequence ...
- 洛谷 P1108 低价购买(LIS,统计方案数)
传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...
- 【LeetCode】292. Nim Game 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】409. Longest Palindrome 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:HashSet 方法三 ...
- LeetCode 292 Nim Game 解题报告
题目要求 You are playing the following Nim Game with your friend: There is a heap of stones on the table ...
- 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- 洛谷 P2197 【模板】nim游戏 解题报告
P2197 [模板]nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以 ...
随机推荐
- ZOJ 2705
这题,找找规律,可以发现一个斐波那契数列.按照斐波那契数列求和,知道, SUM=Fn+2-F1,于是,该长度为Fn+2的倍数.因为斐波那契数列不一定是从1开始的,而从2开始的每个数都是从1开始的倍数. ...
- D3js-绘制地图时出现过小, 设置scale还是无效 的解决方法
使用d3绘制某个地市的地图时,把scale成非常大但是还是无法达到想要的效果. //---------------------------------------------------------- ...
- php,二维数组的输出出现了问题,提示:Notice: Array to string conversion
<?php $arr=array(array("111","222","333"),array("444",&qu ...
- bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)
2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...
- http://www.secrepo.com 安全相关的数据获取源
来自:http://www.secrepo.com Network MACCDC2012 - Generated with Bro from the 2012 dataset A nice datas ...
- Recovering unassigned shards on elasticsearch 2.x——副本shard可以设置replica为0在设置回来
Recovering unassigned shards on elasticsearch 2.x 摘自:https://z0z0.me/recovering-unassigned-shards-on ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- POJ 1979 Red and Black (简单dfs)
题目: 简单dfs,没什么好说的 代码: #include <iostream> using namespace std; typedef long long ll; #define IN ...
- 搭建python3环境
将Python2.7通过控制面板卸载,然后从网站下载python的安装包,安装即可. 安装beatifulsoup4库.在命令行下, pip install beautifulsoup4 千万不能在p ...
- 重设数据文件大小sql语句
set verify off column file_name format a50 word_wrapped column smallest format 999,990 heading " ...