zoukankan      html  css  js  c++  java
  • codeforces 603C. Lieges of Legendre sg函数

    题目链接

    n堆石子, 可以拿走一堆中的一颗, 或者将一堆数量为2*x的石子分为k堆x个的石子。k由题目给出。

    k分奇偶讨论。 k为偶数时,k堆x个的石子异或结果为0; k为奇数时, k堆x个石子异或结果与mex(x)相等, 然后打不同的sg表找规律, 打表程序看代码。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define pb(x) push_back(x)
     4 #define ll long long
     5 #define mk(x, y) make_pair(x, y)
     6 #define lson l, m, rt<<1
     7 #define mem(a) memset(a, 0, sizeof(a))
     8 #define rson m+1, r, rt<<1|1
     9 #define mem1(a) memset(a, -1, sizeof(a))
    10 #define mem2(a) memset(a, 0x3f, sizeof(a))
    11 #define rep(i, a, n) for(int i = a; i<n; i++)
    12 #define ull unsigned long long
    13 typedef pair<int, int> pll;
    14 const double PI = acos(-1.0);
    15 const double eps = 1e-8;
    16 const int mod = 1e9+7;
    17 const int inf = 1061109567;
    18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    19 int sg[105];
    20 /*int mex1(int x) {
    21     if(~sg[x])
    22         return sg[x];
    23     int vis[105];
    24     mem(vis);
    25     vis[mex1(x-1)] = 1;
    26     if(x%2==0)                  //k为奇数
    27         vis[mex1(x/2)] = 1;
    28     for(int i = 0; ; i++)
    29         if(!vis[i])
    30             return sg[x] = i;
    31 }
    32 int mex2(int x) {               //k为偶数
    33     if(~sg[x])
    34         return sg[x];
    35     int vis[105];
    36     mem(vis);
    37     vis[mex2(x-1)] = 1;
    38     if(x%2==0)
    39         vis[0] = 1;
    40     for(int i = 0; ; i++)
    41         if(!vis[i])
    42             return sg[i] = i;
    43 }*/
    44 int mex2(int x) {
    45     if(x<=2) {
    46         return x;
    47     }
    48     if(x&1)
    49         return 0;
    50     return 1;
    51 }
    52 int mex1(int x) {
    53     if(x<=4) {
    54         if(x&1)
    55             return 1;
    56         if(x==2)
    57             return 0;
    58         return 2;
    59     }
    60     if(x&1)
    61         return 0;
    62     int tmp = mex1(x/2);
    63     if(tmp==1)
    64         return 2;
    65     return 1;
    66 }
    67 int main()
    68 {
    69     mem1(sg);
    70     /*sg[0] = 0;
    71     for(int i = 0; i<=100; i++)
    72         sg[i] = mex1(i);
    73     for(int i = 0; i<=100; i++) {
    74         printf("[%d:%d]
    ", i, sg[i]);
    75     }*/
    76     int n, k, x, ans = 0;
    77     cin>>n>>k;
    78     while(n--) {
    79         scanf("%d", &x);
    80         if(k&1)
    81             ans ^= mex1(x);
    82         else
    83             ans ^= mex2(x);
    84     }
    85     if(!ans) {
    86         puts("Nicky");
    87     } else {
    88         puts("Kevin");
    89     }
    90     return 0;
    91 }
  • 相关阅读:
    iOS开发常见错误(转)
    SVN各种错误提示产生原因及处理方法大全(转)
    SVN常见问题(转)
    iPhone6 Plus、iPhone6、iPhone5S和之前版本真实分辨率
    各类 HTTP 返回状态代码详解(转)
    js:全局作用域和调整浏览器窗口大小
    python之制作模块
    python之模块time | strftime || 模块datetime | timedelta | 计算3天前的日期
    python之模块 sys | os
    python之正则表达式 | match | split | findall | sub替换 |
  • 原文地址:https://www.cnblogs.com/yohaha/p/5056487.html
Copyright © 2011-2022 走看看