• Luogu P4101 【[HEOI2014]人人尽说江南好 】


    Description

    传送门


    Solution

    如果每个人每次都只是将一个大小为(1)的石子堆放到当前最大的石子堆里,那么当游戏不能玩的时候局面必定是有(n / m)个大小为(m)的石子堆和(left [ n mod m eq 0 ight ])个大小为(n mod m)的石子堆。

    一共需要(left ( m - 1 ight ) imes left (n / m ight ) + left[ n mod m eq 0 ight ] imes left ( n mod m - 1 ight ))步达到最后的局面。

    如果都按照这样的策略进行游戏,那么如果步数是奇数就是先手胜否则是后手胜利。但是现在还有别的决策可以执行,而且最终局面不是唯一的,但是可以采用一种策略使最终局面就是这样的。考虑如果按这个策略进行游戏本来是先手必胜那么当后手执行决策时有两种可能。

    第一种将一个大小为(1)的石子堆和最大的石子堆合并,这样先手只要继续执行策略最后就能获胜。

    第二种将两个大小为(1)的石子堆合并,这样先手下次只要将这个大小为(2)的石子堆和最大的合并就行,和上面的第一种情况一样都是得到一个最大的石子堆和一些大小为(1)的石子堆。

    如果不能合就直接拿一个大小为(1)的石子堆和最大的合并就行,和上面第一种情况得到的局面还是一样的,都是一个大小为(m)的石子堆和一个大小为(2)的石子堆还有一些大小为(1)的石子堆。

    所以无论是那种决策达到最终局面的步数不变,依然是先手必胜。如果一开始算的步数是后手必胜同理。

    所以按这种决策计算的步数是奇数就是先手胜否则就是后手胜。


    Code

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int n, m;
    
    int main()
    {
    	int t;
    	scanf("%d", &t);
    	while (t--)
    	{
    		scanf("%d%d", &n, &m);
    		printf("%d
    ", (n - (n / m) + (n % m != 0)) % 2 == 0 ? 1 : 0);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    vue.nextTick()方法简单理解
    vue中 hash和history的区别
    Set,Map一些常见的遍历方法以及转化方法
    vue中import和require的用法
    $route和 $router的区别是什么
    vue vmodel的总结
    vue router的钩子函数总结
    了解promise和async await的区别
    ZOJ 1642 Match for Bonus
    UVA 10003 Cutting Sticks
  • 原文地址:https://www.cnblogs.com/Tian-Xing-Sakura/p/13097811.html
Copyright © 2020-2023  润新知