其他分享
首页 > 其他分享> > D - Competition Against a Robot //2020icpc kunming

D - Competition Against a Robot //2020icpc kunming

作者:互联网

D - Competition Against a Robot

3B1B的视频,一年之前都看过这个视频,并且赛场上也第一时间想到了它,只是这题是对3B1B视频的一个小扩展,然后加上时间久+理解确实不够透彻,没有想出来,虽然其实可能当时想起来了“分组”还有“2的幂次”已经很接近了

当时一直觉得%k就是改变奇偶。(主要是高维想不清楚,3维又确实不存在,模不出)

比特位翻转->n维立方体的边

64个格子翻硬币问题,勉强能看下的字幕,standupmaths

64个格子翻硬币问题,将每个数看做一个6位的向量,每一位做不进位加法(在模2意义下对某个数字+1和-1是一样的)

题意: 有一个裁判,一个机器人,两个人A和B。裁判给出两个数n和k(机器人和A和B都知道n和k),机器人会构造一个长度为n的每个数都在 [ 0 , k ) [0, k) [0,k)的串,并选择一个数 p , p ∈ [ 0 , n ) p,p\in[0,n) p,p∈[0,n),然后把这个串和p给A,A对其中一个数进行%k意义下的+1,然后将改完的串给B,B需要猜出p是多少。

n ∣ k n n|k^n n∣kn 明显是有解的必要条件(n维立方体的顶点分组问题,每组的点数至少是整数),他同时也是充分条件(这里待了解)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long ll;

ll gcd(ll a,ll b) {
    if(b==0) return a;
    return gcd(b,a%b);
}

ll n, k;

inline bool check(ll x) {
    for(int i = 1; i <= 100; ++ i) {
        x = x / gcd(x, k);
        if(x == 1) return 1;
        if(gcd(x,k) == 1) break;
    }
    return 0;
}


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

    int T;
    cin >> T;
    while (T--) {
//        ll n, k;
        cin >> n >> k;
        if (!check(n) == 0) {
            cout << "HUMAN\n";
        } else {
            cout << "ROBOT\n";
        }
    }
    return 0;
}

标签:return,gcd,ll,cin,Against,kunming,2020icpc,include,cout
来源: https://blog.csdn.net/qq_39602052/article/details/115448126