AcWing第21场周赛题解

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组没过~就很奇怪,可能哪里还有问题。

posted @ 2022-04-12 10:42  quanjun  阅读(30)  评论(0)    收藏  举报