acwing练习

220. 最大公约数

给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。

GCD(x,y)即求x,y的最大公约数。

输入格式

输入一个整数N

输出格式

输出一个整数,表示满足条件的数对数量。

数据范围

1N1e7  1≤N≤1e7

输入样例:

4

输出样例:

4
这个目前也并没怎么看懂

解析:https://www.cnblogs.com/gzh-red/p/11285929.html#_lab2_1_3

#include <bits/stdc++.h>
const int maxn=1e7+10;
using namespace std;
#define int long long
int phi[maxn],v[maxn],n,prime[maxn],m,sum[maxn],ans;
void euler(){
    m = 0;
    memset(v,0, sizeof(v));
    for(int i = 2; i <= n; i++){
        if(!v[i]) v[i] = 1,prime[++m] = i,phi[i] = i - 1;
        for(int j = 1; j <= m && i * prime[j] <= n; j++){
            v[i * prime[j]] = 1;
            phi[i * prime[j]] = phi[i] *(i % prime[j] ? prime[j] - 1 : prime[j]);
            if(i % prime[j] == 0) break;
        }
    }
}

signed main(){
   ios::sync_with_stdio(0);
   cin >> n;
   euler();
   for(int i = 2; i <= n; i++)
       sum[i] = sum[i - 1] + phi[i];
   for(int i = 1; i <= m; i++){
       int now = n / prime[i];
       ans += sum[now] * 2 + 1;
   }
   cout << ans;
    return 0;
}
View Code

hfxcfsc

原文地址:https://www.cnblogs.com/xcfxcf/p/12318497.html