没输出,求调呜呜呜
  • 板块P2568 GCD
  • 楼主xiaobu_dean
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/16 23:14
  • 上次更新2023/11/2 13:20:38
查看原帖
没输出,求调呜呜呜
959579
xiaobu_dean楼主2023/10/16 23:14
// 初步思路:求1~n中每一个质数对答案的贡献
#include <bits/stdc++.h>
using namespace std;

using ll = long long ;
const int N = 1e7 + 50;
const int M = 1e6 + 50;
int phi[N];
bool st[N];
int p[M];
int cnt;
ll sum[N];
void oular(int n) {
	phi[1] = 1;
	for (int i = 2;i <= n; i++) {
		if (!st[i]) { 
			p[cnt++] = i;
			phi[i] = i - 1; // i为质数那么1~i-1均与i互质
		}
		for (int j = 0;p[j] <= n / i; j++) {
			st[p[j] * i] = true;
			// i和p[j]分解质因数的结果相同                             
		    // phi[i] = i*(1-1/q1)*(1-1/q2)*....
			// phi[i*p[j]] = pj*i*(1-1/q1)*(1-1/q2)...
			// phi[i*p[j]] = p[j] * phi[i]
			if (i % p[j] == 0) {  // i为p[j]的最小质因子
				phi[p[j] * i] = p[j] * phi[i]; 
				break;
			}
			// 欧拉函数为一个积性函数,n = p1*p2...pn,p1~pn互质
			//那么phi(n) = phi(p1)*phi(p2)...*phi(pn)
			phi[p[j] * i] = (p[j] - 1) * phi[i]; // = phi[p[j]] * phi[i]
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    int n; cin >> n;
    oular(n);
    ll ans = 0;
    for (int i = 1;i <= cnt; i++) {
    	sum[i] = sum[i - 1] + phi[i];
    }
    for (int i = 1;i <= cnt; i++) {
    	ans += 2 * phi[n / p[i]] + 1;
    }
    cout << ans << '\n';
	return 0;
}
2023/10/16 23:14
加载中...