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