A. 3997. 整数幂
题目链接:https://www.acwing.com/problem/content/4000/
题目大意:略。
解题思路:只要 l % k == 0
就执行 l /= k
,判断最终 l
是否变为 1。特判初始 l == 1
是 NO,因为 n 是正整数。
示例程序:
#include <bits/stdc++.h>
using namespace std;
int T, k, l;
bool check() {
if (l == 1) return false;
while (l % k == 0) l /= k;
return l == 1;
}
int main() {
cin >> T;
while (T--) {
cin >> k >> l;
puts(check() ? "YES" : "NO");
}
return 0;
}
B. 3998. 变成1
题目链接:https://www.acwing.com/problem/content/4001/
题目大意:略。
解题思路:模拟。tips: 可以先考虑如何加到最后只剩 1 位 1,然后再考虑消掉所有的 0。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
char s[maxn];
int n, cnt, p;
int main() {
cin >> s;
n = strlen(s);
for (int i = n-1; i >= 0; i--) {
if (s[i] == '1') {
cnt++;
if (cnt == 1) p = i;
}
}
if (cnt == 1) {
cout << n-1 << endl;
} else {
cout << n + p + 2 - cnt << endl;
}
return 0;
}
C. 3999. 最大公约数
题目链接:https://www.acwing.com/problem/content/4002/
题目大意:略。
解题思路:其实就是求 \(m / gcd(a,m)\) 的欧拉函数。
示例程序:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
}
long phi(ll m) {
ll res = m;
for (int i = 2; i <= m/i; i++)
if (m % i == 0) {
res = res / i * (i - 1);
while (m % i == 0) m /= i;
}
if (m > 1) res = res / m * (m - 1);
return res;
}
int T;
ll a, m;
int main() {
cin >> T;
while (T--) {
cin >> a >> m;
m /= gcd(a, m);
cout << phi(m) << endl;
}
return 0;
}
这个代码是AC了,但是样例第3组没过~就很奇怪,可能哪里还有问题。