答案

austin2010 2023-01-13 20:31:36 14 返回题目

#include <bits/stdc++.h>

using namespace std;

bool isprime[19000000];

int cnt = 0, pr[19000000], phi[19000000];

int main() {

int n, q;

scanf("%d%d", &n, &q);

memset(isprime, true, n + 1);

for (int i = 2; i <= n; i++) {

    if (isprime[i]) {

        pr[++cnt] = i;

        phi[i] = i - 1;

    }

    for (int j = 1; j <= cnt && i * pr[j] <= n; ++j) {

        isprime[i * pr[j]] = false;

        if (i % pr[j] == 0) {

            phi[i * pr[j]] = phi[i] * pr[j];

            break;

        } else {

            phi[i * pr[j]] = phi[i] * (pr[j] - 1);

        }

    }

}

int a[q];

for (int i = 0; i < q; i++) {

    scanf("%d", &a[i]);

}

for (int i = 0; i < q; i++) {


    printf("%d\n", phi[a[i]]);

}

return 0;

}

{{ vote && vote.total.up }}