【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\)

posted @ 2023-12-31 18:07  Lu_xZ  阅读(105)  评论(0编辑  收藏  举报