D 宿命之间的对决【2023牛客寒假算法基础集训营3】

D 宿命之间的对决

原题链接

题意

  • 现在给定一个正整数n,小红和小紫轮流操作,每次取n的一个因子x,使得n减去x。谁先将n减到0谁输。
    小红先手操作,她想知道在双方足够聪明的情况下,谁会获得最终的胜利?

思路

  1. 奇偶相加减,(同偶异奇)

设奇数a为2k1+1,奇数b为2k2+1,偶数c为2k3,偶数d为2k4.(kZ)
=
(2k1+1)(2k2+1)=2(k1k2)=2knew
=
(2k1+1)2k3=2(k1k3)+1=2knew+1
=
2k32k4=2(k3k4)=2knew
=
2k3(2k1+1)=2(k3k1)1=2knew+1

  1. 奇数的因子中一定没有偶数,偶数的因子中一定有奇数和偶数
    奇数只能变为偶数,偶数总能变为奇数

  2. 递推

n=1时,先手只能减去因子1变为0,因此先手必败
n=2时,先手可以选择减去因子1,后手变为n=1时的必败态,因此n=2时先手必胜
n=3时,先手只能减去因子1,后手变为n=2时的必生态,因此n=3时先手必败
n=4时,先手可以选择减去因子1,后手变为n=3时的必败态,因此n=4时先手必胜
n=偶数,偶数总能变为奇数,奇数只能变为偶数,因此先手只要每次减为奇数就能保持自己是偶数
n=奇数,奇数只能变为偶数,偶数总能变为奇数,因此后手只要每次减为奇数就能保持自己是偶数
偶数先手总是能转变为前后已有的后手的必败态,奇数先手只能转变为前后已有的后手的必胜态
偶数先手必胜,奇数先手必败

代码

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;

#define X first
#define Y second

typedef long long LL;
const char nl = '\n';

void solve(){
	LL n;
	cin >> n;
	if(n%2)cout << "yukari";
	else cout << "kou";

}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);

		solve();
	
}
posted @   Keith-  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示