【LGR-170-Div.3】洛谷基础赛 #6 & Cfz Round 3 & Caféforces #2
这套题感觉质量很高,思维含量大概div.2?
A.Battle
\[x \equiv r(\bmod P)
\]
\[P \mid x - r
\]
因此只有第一次操作是有效的。
void solve() {
int n, m, p;
cin >> n >> m >> p;
m -= m % p;
if(!m) puts("Alice");
else {
n -= n % p;
if(!n) puts("Bob");
else puts("Lasting Battle");
}
}
B.Change
题目大意:\(x\) 初始为 \(0\),给定 \(a, b, c, P\),可进行如下操作,
- \(x \leftarrow (x + b) \bmod P\)
- \(x \leftarrow (x \times a) \bmod P\)
问能否通过正整数次操作将 \(x\) 变为 \(c\)。
考虑将问题划分为两大类。
case1:\(c= 0\),显然成立。
case2:\(c \neq 0\)
如果 \(b = 0\),则一定无解,因为不管怎么操作 \(x\) 始终为 \(0\)。
如果 \(b \neq 0\),可以使 \(x = kb\),
我们令 \(k = inv(b) \times c\),其中 \(inv(b)\) 为 \(b\) 在模 \(P\) 意义上的逆元。
则 \(x = c\)
void solve() {
int P, a, b, c;
cin >> P >> a >> b >> c;
bool x = c && b;
bool y = !c;
bool ok = x || y;
puts(ok ? "Yes" : "No");
}
C.Xor with Gcd
不会推式子,所以直接找规律。
打表发现,对于任意奇数 \(n\),有
\[\gcd(1,n) \oplus \gcd(2,n) \oplus \cdots \oplus \gcd(n,n) = n
\]
奇数解决了,一个很直观的想法是偶数一定与其相邻的奇数有关。
继续打表。
然后就做完了。
void solve() {
ll n;
cin >> n;
if(n & 1) {
cout << n << '\n';
}
else {
ll t = (n + 1) / 2;
if(t & 1) -- t;
else ++ t;
cout << ((n + 1) ^ t) << '\n';
}
}
upd:更新正解。
由于 \(gcd(i, n) = gcd(n - i, n)\),
所以 \(n\) 为奇数时前后都消掉了,答案为 \(n\)。
而偶数还剩下 \(gcd(\dfrac{n}{2} , n)\) 和 \(gcd(n, n)\) 两项,答案为\(\dfrac{n}{2} \oplus n\)。