zoukankan      html  css  js  c++  java
  • 洛谷 [P2148] E&G

    SG函数的应用

    首先每一组都是独立的,所以我们可以求出每一组的SG值异或出来。

    那么怎么求每一组的SG值呢,网上的题解都是打表找规律,但其实这个规律是可以证明的

    先看规律:
    x为奇数,y为奇数:SG=0
    x为偶数,y为偶数:SG=SG(x/2 , y/2)+1
    x为奇数,y为偶数:SG=SG((x+1)/2 , y/2)+1
    x为偶数,y为奇数:SG=SG(x/2 , (y+1)/2)+1

    即寻找如下最小的k使得 $ i - 1 < 2 ^ k (mod 2 ^ (k + 1))$

    证明如下:
    引理一:
    当去掉一堆后,剩下的一堆为奇数时,这些后继的的 mex 值为 0,
    用数学归纳法证明:

    1. 1不合法,最小合法的奇数为 3,当该数为 3 时,显然成立。
    2. 假设小于奇数n的奇数均满足此性质,因为一个奇数 n 一定能切仅能分解成一个奇数和一个偶数的后继,这个后继因为其中有一个奇数,所以该后继的后继一定有 0,所以这个后继的 SG 值一定大于 0,所以n的 SG 值一定为 0

    由引理一可以得出当剩下的一堆为偶数时,该状态的 SG 值一定不为 0

    当两个数均为奇数时,SG 为 0,规律一得证

    当两个数一奇一偶时, SG 一定不为 0 ,且只有剩下偶数堆时对 SG 值才有贡献。

    引理二:

    当去掉一堆后,剩下的一堆为偶数 n 时,这些后继的 mex 值为 SG(n/2) + 1 , 2 的后继的 mex 为 1

    数学归纳法证明:

    一个偶数 n 一定能分解成两个奇数,所以后继中一定有 0 (引理一)

    一个大于 2 的偶数 n 一定能分解成两个偶数,且分解出的偶数的集合为{2, 4, ……, n - 2}

    。。。翻车了

        #include<cstdio>  
        #include<cstring>  
        #include<iostream>  
        #include<algorithm>  
        using namespace std;  
        int SG(int n,int m)  
        {  
            if(n&1&&m&1)return 0;  
            if(!(n&1)&&!(m&1))return SG(n>>1,m>>1)+1;  
            if(!(n&1)&&m&1)return SG(n>>1,(m+1)>>1)+1;  
            if(n&1&&!(m&1))return SG((n+1)>>1,m>>1)+1;  
        }  
        int main()  
        {  
            int T;  
            scanf("%d",&T);  
            while(T--)  
            {  
                int n,ans=0;  
                scanf("%d",&n);  
                for(int i=1;i<=(n>>1);i++)  
                {  
                    int x,y;  
                    scanf("%d%d",&x,&y);  
                    ans^=SG(x,y);  
                }     
                if(ans)puts("YES");  
                else puts("NO");  
            }     
        }  
    
  • 相关阅读:
    equals()与=的区别
    HashTable和HashMap的区别
    shell高级用法——磁盘管理 创建虚拟的磁盘映射到一个文件
    shell妙用之——dd命令合并多个烧录文件为一个flash镜像
    自动解包ROM 文件获取uboot,uboot-spl ,uImage, rootfs.tar.gz 并烧写SD卡
    运用层通过shell脚本直接操控gpio
    shell脚本之位运算+for循环+返回值承接+shell小数运算
    shell函数递归调用实现目录的对比拷贝
    用debootstrip制作debian环境的rootfs
    shell命令的高级使用之---选择性copy
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8476277.html
Copyright © 2011-2022 走看看