题目链接: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 解题报告 (统计方案数)的更多相关文章

  1. 【NOIP模拟赛】chess 建图+spfa统计方案数

    似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...

  2. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  3. Python练习题 030:Project Euler 002:偶数斐波那契数之和

    本题来自 Project Euler 第2题:https://projecteuler.net/problem=2 # Each new term in the Fibonacci sequence ...

  4. 洛谷 P1108 低价购买(LIS,统计方案数)

    传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...

  5. 【LeetCode】292. Nim Game 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 【LeetCode】409. Longest Palindrome 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:HashSet 方法三 ...

  7. LeetCode 292 Nim Game 解题报告

    题目要求 You are playing the following Nim Game with your friend: There is a heap of stones on the table ...

  8. 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告

    P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...

  9. 洛谷 P2197 【模板】nim游戏 解题报告

    P2197 [模板]nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以 ...

随机推荐

  1. sigprocmask和信号阻塞

    注意阻塞和忽略,是有区别的. 阻塞只是暂时的,忽略是就没了. 参数:how:用于指定信号修改的方式,可能选择有三种:SIG_BLOCK //加入信号到进程屏蔽.SIG_UNBLOCK //从进程屏蔽里 ...

  2. c#将List&lt;T&gt;转换成DataSet

    /// <summary>         /// List<T> 转换成DataSet         /// </summary>         /// &l ...

  3. 基础数位DP小结

    HDU 3555 Bomb dp[i][0] 表示含 i 位数的方案总和. sp[i][0] 表示对于位数为len 的 num 在区间[ 10^(i-1) , num/(10^(len-i)) ] 内 ...

  4. FPGA视频拼接器的放大和缩小功能

    视频视频器能够把信号源放大和缩小. 对于我们的拼接器而言,它的架构这种: 信号源进入到拼接器中.先进入缩小模块.然后存进DDR中.然后从DDR中读出视频.进入到放大模块,最后依据屏幕的位置,输出到屏幕 ...

  5. 省赛i题/求1~n内全部数对(x,y),满足最大公约数是质数的对数

    求1~n内全部数对(x,y),gcd(x,y)=质数,的对数. 思路:用f[n]求出,含n的对数.最后用sum[n]求和. 对于gcd(x,y)=a(设x<=y,a是质数),则必有gcd(x/a ...

  6. MongoDB增加数据

    MongoDB中出了增加之外,其他的操作都很麻烦. 例子: 1.简单的 db.infos.insert({"url":"www.baidu.com"}); 2. ...

  7. iOS开发之UIAlertController的适配

    在iOS8中,只能用UIAlertController.而原来的UIAlertView及UIActionSheet已经被抛弃掉了.但是如果一台iOS 7 的手机运行到有UIAlertControlle ...

  8. 关于webuploader跨域解决方法

    1.在iis处理程序映射 2.后台ashx处理添加如下代码

  9. @Query Annotation in Spring Data JPA--转

    原文地址:http://javabeat.net/spring-data-jpa-query/ In my previous post on Spring Data, I have explained ...

  10. Storm Spout

    本文主要介绍了Storm Spout,并以KafkaSpout为例,进行了说明. 概念 数据源(Spout)是拓扑中数据流的来源.一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中. ...