打卡信奥刷题(3145)用C++实现信奥题 P7656 [BalticOI 1996] A NUMBER GAME (Day 2)
P7656 [BalticOI 1996] A NUMBER GAME (Day 2)题目描述下面是一个游戏。首先我们赋给变量n nn和变量m mm整数值。玩家 A 和 B 开始轮流移动A 先。每次移动都会选择一个正整数k ≤ min { m , n } k \le \min \lbrace m,n \rbracek≤min{m,n}这会将变量n nn的值减少k kk。但是不允许使用一个或另一个玩家在之前的移动中已经使用的数字。当其中一名玩家无法移动时游戏结束。 走最后一步的玩家是赢家。请编写一个程序说明哪个玩家有获胜策略。输入格式第一行包含两个整数n nn和m mm用空格分隔。输出格式第一行谁有获胜策略接下来的行A 的所有可能的第一步动作依次递增然后是单词 “winning” 或 B 的一个获胜答案。输入输出样例 #1输入 #13 2输出 #1B wins 1 2 2 1输入输出样例 #2输入 #27 4输出 #2A wins 1 winning 2 winning 3 4 4 3说明/提示数据规模与约定对于100 % 100 \%100%的数据0 n ≤ 70 0 n \le 700n≤700 m ≤ 20 0 m \le 200m≤20。分值说明本题分值按 BOI 原题设置满分40 4040。题目说明来源于 Baltic Olympiad in Informatics 1996 的 Day 2:A NUMBER GAME。由 求学的企鹅 翻译整理。C实现#includeiostreamusingnamespacestd;intn,m;intmem[121|1];//0表示失败非零数字表示需要选择mem[x]就会必赢boolvis[121|1];intdfs(intx){if(vis[x])returnmem[x];intcurnn;for(inti1;im;i){if(xi1){curn-i;}}for(intimin(curn,m);i1;i--){if(xi1)continue;intresdfs(x|(1i));if(res0){vis[x]true;returnmem[x]i;}}vis[x]true;returnmem[x]0;}intmain(){cinnm;if(dfs(0)){cout A wins\n;}else{cout B wins\n;}for(inti1;imin;i){if(i9)cout ;couti ;intresdfs(1i);if(res0){coutwinning\n;}else{coutres\n;}}return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容