P1857 质数取石子 (DP,递推)
题目描述
桌上有若干个石子,每次可以取质数个。谁先取不了,谁就输。问最少几步能赢?(一个人取一次算一步)
输入输出格式
输入格式:
第一行N,表示有N组数据
接下来N行为石子数
输出格式:
每组数据一个数,若必胜,则输出最少步数,否则输出-1
输入输出样例
3
8
9
16
1
-1
3
说明
石子数≤20000,N≤10
Solution
NIm 游戏的质数版 思路基本和原版一致 即每一个必胜状态都由上一次必败的状态转过来.然后需要先一个筛法筛出20000以内的质数. 然后照Nim 游戏的动规方程 即可.不过这里的状态要多加一维用于加上场数这个信息的保存. 这里用的是
f[i][0] 代表场数
f[i][1] 代表
1 --> 必胜
-1 --> 必败
细节就是质数枚举的时候要倒着从大的开始 否则会有鬼.
代码 :
#include<bits/stdc++.h>
using namespace std;
int n,f[][]={},a[];
int p[],maxn=-,sum; int v[];
void pre()
{
for(int i=;i<=;i++)
{
if(v[i]==)
{
p[++sum]=i;
for(int j=;j*i<=;j++)
v[i*j]++;
}
}
} void solve()
{
f[][]=-;f[][]=;
f[][]=-;f[][]=;
f[][]=;f[][]=;
f[][]=;f[][]=;//初始化几个点
for(int i=;i<=maxn;++i)
for(int j=sum;j>=;--j)
if(p[j]<=i)
{
if(f[i-p[j]][]==-) //前驱为必败
if(f[i][]==||f[i][]==-)//尚未判定状态
{
f[i][]=;
f[i][]=f[i-p[j]][]+;
}
else
f[i][]=min(f[i][],f[i-p[j]][]+);//选取场数最小值
if(f[i-p[j]][]==)//前驱为必胜
if(f[i][]==)
{
f[i][]=-;
f[i][]=f[i-p[j]][]+;
}
else if(f[i][]==-)
f[i][]=max(f[i][],f[i-p[j]][]+); //败了久选最大值.
}
return;
} int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
maxn=max(a[i],maxn);
}
pre();
solve();
for(int i=;i<=n;i++)
if(f[a[i]][]==-)
printf("-1\n");
else printf("%d\n",f[a[i]][]);
return ;
}
P1857 质数取石子 (DP,递推)的更多相关文章
- [NOI2009]管道取珠 DP + 递推
---题面--- 思路: 主要难点在思路的转化, 不能看见要求$\sum{a[i]^2}$就想着求a[i], 我们可以对其进行某种意义上的拆分,即a[i]实际上可以代表什么? 假设我们现在有两种取出某 ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Cogs 56. 质数取石子(博弈)
质数取石子 ★★ 输入文件:stonegame.in 输出文件:stonegame.out 简单对比 时间限制:1 s 内存限制:128 MB 问题描述 DD 和 MM 正在玩取石子游戏.他们的游戏规 ...
- hdu 2604 Queuing(dp递推)
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
- BZOJ4321queue2——DP/递推
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
- HDU 2154 跳舞毯 | DP | 递推 | 规律
Description 由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥. 小黑买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是 ...
- dp递推 数字三角形,dp初学者概念总结
数字三角形(POJ1163) 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出 ...
- 【COGS 56】质数取石子
[问题描述] DD 和 MM 正在玩取石子游戏.他们的游戏规则是这样的:桌上有若干石子,DD 先取,轮流取,每次必须取质数个.如果某一时刻某一方无法从桌上的石子中取质数个,比如说剩下 0 个或 1 个 ...
- Power oj2498/DP/递推
power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 12 Accepted: 3 ...
随机推荐
- 实训随笔:EL表达式JSON应用
由于之前在学校写的jsp页面都是夹杂着java代码的,所以之前写了个jsp,满满的<%%>和java代码,老师说那样太不美观了啊!!!要全部用EL表达式替代了.本人还是太笨了,弄了一上午才 ...
- 诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)
适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 和更高版本本文档所含信息适用于所有平台 用途 本文提供了诊断 11GR2 和 12C G ...
- Educational Codeforces Round 11 C hard process_补题——作为司老大的脑残粉
司老大当时教了一种姿势枚举连续K个0,说实话当时比赛写这题完全蒙了 纵然后来知道思路还是写了一段时间 真的是.. 题目大意 n长度的序列,由0 1构成 我们可以改变 k个0为1 求可以得到的最长连续1 ...
- IOS Array 排序方法
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { if ([obj1 integerVal ...
- SniperOJ-leak-advanced-x86-64
借助DynELF实现无libc的漏洞利用小结 1.leak-advance与leak的区别在于一个可用函数是write,一个可用函数是puts.write比puts更容易利用,虽然write需要的参数 ...
- prototype中的ajax异步加载
jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...
- NLP.TM | GloVe模型及其Python实现
在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用, ...
- centos7 中安装 mysql5.6 的过程
前提是Centos的环境是好的,并且相关的软件包已经安装好. 1.创建用户,并修改创建的数据目录的属主 [root@bogon ~]# useradd -M mysql -s /sbin/nologi ...
- idea 插件推荐 & 代码样式安装
部分链接打不开的可能需要梯子, 部分插件我懒得截图了,麻烦 ---------------------------------------header------------------------- ...
- fshc之请求仲裁机制的代码分析
always@(posedge spi_clk or negedge spiclk_rst_n) begin if(~spiclk_rst_n) arbiter2cache_ack_r <='b ...