题目链接: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开发必背API

    1.java.io.file类,File用于管理文件或目录: 所属套件:java.io File file = new File(fileStringPath); 1)file.mk(),真的会创建一 ...

  2. IntegerToBinaryString

    IntegerToBinaryString 方法写的非常的巧妙:佩服佩服! package com.stono.jdk; public class IntegerToBinaryString { pu ...

  3. bzoj1202: [HNOI2005]狡猾的商人(差分约束)

    1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可 ...

  4. bzoj1045: [HAOI2008] 糖果传递(数论)

    1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量 ...

  5. 90.bower解决js的依赖管理

    转自:https://blog.csdn.net/u011537073/article/details/52951122 前言一个新的web项目开始,我们总是很自然地去下载需要用到的js类库文件,比如 ...

  6. dll开发

    _declspec(dllexport) void fun() { }

  7. ADO.NET之断开数据连接的数据库操作

    在ADO.NET对数据库操作时有两种方式一种时与数据库实时连接,第二种时断开连接的操作. 断开连接的操作使用SqlDataAdapter来实现,我们要把数据库中的表数据加载到winform中的data ...

  8. windows 路由

    route ? 查看帮助 route print 查看路由表 添加一条路由: route add 10.10.10.0 mask 255.255.255.0  192.168.1.1 #到达10.10 ...

  9. ICA(独立成分分析)笔记

    ICA又称盲源分离(Blind source separation, BSS) 它假设观察到的随机信号x服从模型,其中s为未知源信号,其分量相互独立,A为一未知混合矩阵. ICA的目的是通过且仅通过观 ...

  10. Unable to load annotation processor factory

    很多人在项目开发中都会遇到项目名称左上角有个红叉,有些是Jar问题,有些是代码问题,有些是编译问题,对于我这种强迫症的是受不了这种情况发生的,如果不影响项目启动还好,废话少说,今天工作就出现了一个问题 ...