题目链接: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. java.util.UnknownFormatConversionException: Conversion = ''';

    今天在测试一个新的项目,在执行sql查询报表的时候.由于我的sql中带有%,导致在输出日志时报错“java.util.UnknownFormatConversionException: Convers ...

  2. linux内核模块笔记

    主题: 1. 嵌入式基础知识 2. linux内核介绍 3. 内核的编译和安装(x86) 4. 第一个模块 5. 模块的相关工具 6. 模块的符号导出 7. 模块的參数 1.看linux/module ...

  3. jquery outerHeight方法 outerWidth方法 获取元素实际宽度高度

    曾经写代码中,每当须要获取元素的实际"宽度"(这里的宽度是指元素宽度加上其边距)时,都须要用元素宽度加上margin值才行,今天发现一个叫outerWidth(options)的方 ...

  4. MongoDB 数据库下载和安装

    MongoDB是一款非常流行的非关系型数据库,将面向对象数据存储做的非常好.这里就不具体介绍它的使用,本文主要解说怎样安装MongoDB数据库.把自己安装过程中碰到的问题和最后解决方法分享给大家,希望 ...

  5. 4.git "Could not read from remote repository.Please make sure you have the correct access rights."解决方案

    转自:https://zhiku8.com/git-could-not-read-from-remote-repository.html 我们在使用git clone 或其他命令的时候,有时候会遇到这 ...

  6. 计算label

    func getCGSize(size:CGSize,fontSize:CGFloat,text:String)->CGSize{ let attributes = [NSFontAttribu ...

  7. calender怎么获取每周的周日(给每周的周日特定时间点设置定时)

    获取每周的周日 //如果是周日,特殊处理.老外的周日-周六为一周 calendarTemp.add(Calendar.WEEK_OF_MONTH,1); calendarTemp.set(Calend ...

  8. 【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)

    满足以下3个条件才能自动解决依赖性: 1.使用rpmdb -redhat(在安装时会自动弹出依赖性错误) 2.所有互相依赖的软件都必须在同一个目录下面. 3.调用-aid参数.

  9. 「JavaSE 重新出发」01. Java介绍

    「白皮书」关键术语 简单性(C++--) 面向对象 分布式 健壮性 安全性 体系结构中立 可移植性 解释型 高性能 多线程 动态性 Java 发展历程 SUN公司--Stanford Universi ...

  10. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...