P2568 GCD(给定整数N求Gcd(x,y)为素数的数对(x,y)有多少对)

思路:与这道题差不多,不过要加一个素数筛。开o2才过,不开不能过。

// luogu-judger-enable-o2
#include 
#define int long long
using namespace std;
const int32_t N = 1e7 + 10;
int t, n, phi[N], b[N], g[N], ans;
vectorp;
bool isp[N];
void prime(int n) {
    isp[0] = isp[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(!isp[i])
            p.push_back(i);
        for(int j = 0; j < p.size() && i * p[j] <= n; j++) {
            isp[i * p[j]] = 1;
            if(!(i % p[j]))
                break;
        }
    }
}
int32_t main() {
    cin >> n;
    prime(n);
    for(int i = 2; i <= n / 2; i++) {
        if(!phi[i])
            for(int j = i; j <= n / 2; j += i) {
                if(!phi[j])
                    phi[j] = j;
                phi[j] = phi[j] / i * (i - 1);
            }
    }
    for(int i = 2; i <= n; i++) {
        if(!isp[i])
            for(int j = i * 2; j <= n; j += i) {
                ans += phi[j / i] * 2;
            }
    }
    for(int i = 1; i <= n; i++)
        if(!isp[i])
            ans++;
    cout << ans;
    return 0;
}

 

你可能感兴趣的:(数论)