1 条题解
-
0
思路:
xiaomao 获胜, 其中 ( ) 和 其中 是素数 否则 Jerry_seven 获胜。
证明:
让我们来分析以下 种情况:
- 情况 : n 是奇数 这里 Jerry_seven 可以用 除以它自己,因为它是奇数,因此是 ,而 xiaomao 输了。这里 是个例外。
- 情况 : 是偶数,并且没有大于 的奇数除数。 这里的 是 的形式。由于 没有大于 的奇数除数,所以 Jerry_seven 不得不减去 使 成为奇数。因此,如果是 ,xiaomao 获胜。对于 , 等于 ,因此 Jerry_seven 获胜。
- 情况 : 是偶数且有奇数除数 如果 可以被 整除,那么 Jerry_seven 可以将 除以最大的奇数因子,之后 变成 的形式,其中 是奇数,因此 Jerry_seven 获胜。 否则 必须是 的形式,其中 是奇数。如果 是素数,那么 Jerry_seven 就输了,因为他可以将 减去 或除以 ,而这两种方法都会让他输掉。如果 不是质数,那么 必须是 的形式,其中 是质数,而 是任何奇数 。Jerry_seven 可以用 除以 来获胜。
代码:
#include <bits/stdc++.h> using namespace std; #define int long long #define FastIO ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr) int IsPrime(int n) { if(n < 2) return false; for(int i = 2; i <= sqrt(n); i ++) { if(n % i == 0) return 0; } return 1; } void solve() { int n; cin >> n; if(n == 1) cout << "xiaomao" << endl; else if(n == 2) cout << "Jerry_seven" << endl; else { if(n & 1) cout << "Jerry_seven" << endl; else { int cnt = 0; while(n) { n /= 2; cnt ++; if(n & 1) break; } if(n == 1) cout << "xiaomao" << endl; else if(IsPrime(n)) { if(cnt == 1) cout << "xiaomao" << endl; else cout << "Jerry_seven" << endl; } else cout << "Jerry_seven" << endl; } } } signed main() { FastIO; int _T_ = 1; cin >> _T_; while(_T_ --) solve(); return 0; }
- 1
信息
- ID
- 1080
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 26
- 已通过
- 3
- 上传者