k-1

斐波那契博弈(Fibonacci Nim)

孤人 提交于 2020-02-28 04:56:04
问题: 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗; 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。 约定取走最后一个石子的人为赢家,求必败态。 结论: 当n为Fibonacci数的时候,先手必败。 f[i]:1,2,3,5,8,13,21,34,55,89…… 证明: 数学归纳法: 为了方便,我们将n记为f[i]。 1、当i=2时,先手只能取1颗,显然必败,结论成立。 2、假设当i<=k时,结论成立。 则当i=k+1时,f[i] = f[k]+f[k-1]。 则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。 (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k],因为f[k] < 2*f[k-1]) 对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取的石子数x的情况。 如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时x=f[k-1]-y,则x<=2/3*f[k-1]。 我们来比较一下2/3*f[k-1]与1/2*f[k]的大小。即4*f[k-1]与3*f[k]的大小,对两值作差后不难得出,后者大。 所以我们得到,x<1/2*f[k]。 即后手取完k

51Nod 1070 Bash游戏 V4(斐波那契博弈)

别说谁变了你拦得住时间么 提交于 2020-02-28 04:54:27
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈, http://blog.csdn.net/acm_cxlove/article/details/7835016 ,关于斐波那契博弈的介绍,可以看看这篇博客。以下的内容便是转自这篇博客。 1、当i=2时,先手只能取1颗,显然必败,结论成立。 2、假设当i<=k时,结论成立。 则当i=k+1时,f[i] = f[k]+f[k-1]。 则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。 (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k],因为f[k] < 2*f[k-1]) 对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取的石子数x的情况。 如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时x=f[k-1]-y,则x<=2/3*f[k-1]。 我们来比较一下2/3*f[k-1]与1/2*f[k]的大小。即4*f[k-1]与3*f[k]的大小,由数学归纳法不难得出,后者大。 所以我们得到,x<1/2*f[k]。 即后手取完k-1堆后,先手不能一下取完k堆,所以游戏规则没有改变

51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

不问归期 提交于 2020-02-28 04:51:57
Bash游戏V1 有一堆石子共同拥有N个。 A B两个人轮流拿。A先拿。每次最少拿1颗。最多拿K颗。拿到最后1颗石子的人获胜。如果A B都很聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。 比如N = 3。K = 2。不管A怎样拿,B都能够拿到最后1颗石子。 Input 第1行:一个数T。表示后面用作输入測试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行2个数N,K。中间用空格分隔。(1 <= N,K <= 10^9) Output 共T行。假设A获胜输出A,假设B获胜输出B。 Input演示样例 4 3 2 4 2 7 3 8 3 Output演示样例 B A A B 解题思路: 假设是(k+1)的整数倍。先手取不论什么一个1~k内的数x。后手都能够取(k+1-x)个石子,于是k+1的整数倍是先手的必败态,同理,不是k+1的整数倍时,先手能够取n%(k+1)个石子。从而使后手必败。 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n,k,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k);

hdu2516-取石子游戏 (斐波那契博弈)【博弈 二分查找】

房东的猫 提交于 2020-02-28 04:49:15
http://acm.hdu.edu.cn/showproblem.php?pid=2516 取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3248 Accepted Submission(s): 1897 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input 输入有多组.每组第1行是2<=n<2^31. n=0退出. Output 先取者负输出"Second win". 先取者胜输出"First win". 参看Sample Output. Sample Input 2 13 10000 0 Sample Output Second win Second win First win 题解:找规律吧。经分析,可以判断必败态有2,3,5,8,13,21... 可以发现,必败态是一个斐波那契数列。然后,如果n为斐波那契数列元素,则必败;否则,必胜。 下面看下数学证明: 就像“Wythoff博弈”需要“Beatty定理

Codeforces Round #581 (Div. 2)

纵然是瞬间 提交于 2020-02-27 05:44:31
传送门 A. BowWow and the Timetable (思维) •题意   在 Saint Petersburg 城市,每天有 T ($T \leq 2_100$)分钟;   这个城市有一个车站,该车站只在第 $4^0,4^1,4^2,\cdots$ 分钟有车经过;   问,如果在 S 分钟到达车站,会错过几辆车?   其中,S 是按照二进制的形式给出; •题解一(BigInteger)   用 Java 中的大数处理这个题,就是先将 S 转化成十进制,在转化成 4 的幂的形式;   属于无脑操作,细节看代码; •Code    CodeForces1204A.java •题解二(二进制转四进制)   $2^k=4^{\lfloor{\frac{k}{2}}\rfloor}$;   且有 $2^0+2^1+2^2+\cdots +2^k < 2^{k+1}$   假设输入的二进制数 S 存放在字符数组中,并且 |S| = k,即最高位为 $2_{k-1}$;   如果 k-1 为奇数,即 k 为偶数,那么 $4^{\lfloor{\frac{k-1}{2}}\rfloor} < S < 4^{\lfloor{\frac{k}{2}}\rfloor}$,易得共错过 $\frac{k}{2}$ 辆车;   如果 k-1 为偶数,那么,$S \ge 4^{\lfloor{

省选模拟三十一 题解

百般思念 提交于 2020-02-25 22:24:17
T1 $dp[i]=max(dp[j]-C_{j+1}^{2}+ij+a[i]-C_i^2)$ 简单的一个线段树维护凸包 T2 设$dp[S][i]$代表$[1,k]$选的次数为$S$,上一次选i的之后的方案数 要求第$k$小的字典串,逐位选择后用$dp$数组来判断是否小于等于$k$ 期望得分$80$分 $k<=26,n<=2e18$ 发现其实k>8则每次一定是加一定形如$ABABABABA$的前缀使得$k-=2$ T3 不妨让$n=n-k+m,k=m$ 现在就和$m$无关了 设$f(n,k)$代表$n,k$时的答案 假设$B[i][m]!=B[i+1][m]$ 设$B[i][m]=x$ 则$B[i][m+1...k]$一定是$n$的后缀,$B[i+1][m+1...k]$一定是$x+2,x+3...x+k$ ($k=1$时不满足) 差值为$n-x-k$,那么总贡献即为 $$\sum\limits_{i=1}^{n-k}n-k-i$$ $$=C_{n-k}^{2}$$ $$=g(n,k)$$ 如果$B[i][m]=B[i+1][m]$, 贡献是$f(n-x,k-1 )$ 综上所述:$f(n,k)=g(n,k)+\sum\limits_{i=1}{n-k+1}f(n-i,k-1)$ 现在问题转化为对于每个$g(n,k)$求出它的贡献系数来 从实际含义入手考虑这个式子,相当于把$n

某公司运筹优化岗位第一次面试

我的梦境 提交于 2020-02-22 02:29:12
P问题, NP问题, NPC问题, NP-hard问题 基本概念 复杂度级别: 1)多项式级别O(n^k);2)非多项式级别,如,指数级O(a^n)和阶乘级别O(n!)。后者的复杂度无论如何都大于前者。 归约(约化):如果能找到这样一个多项式变换法则,对任意一个程序A的输入,都能按这个法则变换为程序B的输入,使两程序的输出相同,那么我们说,问题A可归约为问题B。 通俗解释:一个问题A可以归约为问题B指,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。 特点:“问题A可归约为问题B”有一个直观意义,B的时间复杂度高于或者等于A的时间复杂度,既,问题A不比问题B难。 性质:传递性。如果问题A可以归约为问题B,问题B可以归约为问题C,则问题A一定可以归约为问题C。 P问题, NP问题, NPC问题, NP-hard问题的定义和相互关系 P问题(polynomial):求解一个问题的时间复杂度是多项式级别 NP问题(nondeterministic polynomial):可以在多项式时间里验证解是否正确的问题。定义NP问题的意义在于,如果一个问题不能在多项式时间验证,则这个问题一定没有多项式时间的算法。 图中某条路是否是Hamilton回路,可以在多项式时间验证,是NP问题图中 是否不存在Hamilton回路,不可以在多项式时间验证。 NPC问题

[Codeforces Round #619][Codeforces 1301E. Nanosoft]

北城余情 提交于 2020-02-14 01:51:55
题目链接: 1301E - Nanosoft 题目大意:给定一个\(n\times n\)的四色矩阵,要求回答\(q\)次询问:求一个子矩阵中最大的满足条件的正方形。一个正方形满足条件当且仅当其边长为偶数且把他均分成四块后,每个\(\frac{1}{4}\)大小的正方形都等于对应的颜色(左上为'R',右上为'G',左下为'Y',右下为'B')。\(n,m\le 500, q\le 300000\) 题解:第一眼看过去还以为是什么奇怪数据结构题,结果发现并不需要...    通过观察可以发现,以一个点为左上角的正方形最多只会有一个,这个结论可以很容易证明出来,考虑以该点为左上角的子矩阵,假设目前正方形大小为\(x\),那么这个子矩阵的第一行前\(\frac{x}{2}\)列一定是'R',第一行第\(\frac{x}{2}+1\)列一定是'G',那么无论\(x\)是加或减,都不能让这个正方形满足条件。    这样我们就可以考虑如何求出一个点为左上角的合法正方形的大小。我们可以进行一个\(O(n^3)\)的判断,即同时枚举左上角的位置和大小,然后\(O(1)\)判断是否满足条件。判断的方式有很多种,我的方法是直接给每个位置赋值,把“RGYB”分别设成对应的\({0,1,10^6,10^{12}}\),这样如果四个分别区间和等于对应的值就是合法的。当然也可以直接开四个数组分别记录每个颜色

数学分析笔记5:导数的应用

ⅰ亾dé卋堺 提交于 2020-02-11 21:04:29
泰勒公式 带佩亚诺余项的泰勒公式 微分的意义是用线性函数去逼近一个复杂的函数。实际上,我们还可以引入更高次的多项式取逼近一个复杂的函数,这就是Taylor公式表达的观点。 定理5.1 f ( x ) f(x) f ( x ) 在 x 0 x_0 x 0 ​ 的某个邻域上有直到 n − 1 n-1 n − 1 阶导数,并且在 x 0 x_0 x 0 ​ 具有 n n n 阶导数,则 f ( x ) = ∑ k = 0 n f ( k ) ( x 0 ) k ! ( x − x 0 ) k + o ( ( x − x 0 ) n ) f(x) = \sum_{k=0}^{n}\frac{f^{(k)}(x_0)}{k!} {(x-x_0)^k} +o((x-x_0)^n) f ( x ) = k = 0 ∑ n ​ k ! f ( k ) ( x 0 ​ ) ​ ( x − x 0 ​ ) k + o ( ( x − x 0 ​ ) n ) 证: 首先, n = 1 n=1 n = 1 时结论显然成立。 假设,如果函数 f ( x ) f(x) f ( x ) 在 x 0 x_0 x 0 ​ 处有直到 m m m 阶导数,有 f ( x ) = ∑ k = 0 m f ( k ) ( x 0 ) k ! ( x − x 0 ) k + o ( ( x − x 0 ) m ) f(x)

神奇的幻方[算法竞赛]

扶醉桌前 提交于 2020-02-11 18:33:43
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,…N x N 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 K (K=2,3,…,N x N) : 1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列; 2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行; 3.若 (K-1) 在第一行最后一列,则将 K 填在 (K-1) 的正下方; 4.若 (K-1) 既不在第一行,也最后一列,如果 (K-1) 的右上方还未填数,则将 K 填在 (K-1) 的右上方,否则将 k 填在 (K-1) 的正下方。 输入描述: 一个正整数 N ,即幻方的大小。 输出描述: 共 N 行 ,每行 N 个整数,即按上述方法构造出的 N x N 的幻方,相邻两个整数之间用单空格隔开。 示例1 输入 3 输出 8 1 6 3 5 7 4 9 2 示例2 输入 25 输出 327 354 381 408 435 462 489 516