题目链接 http://acm.hust.edu.cn/vjudge/problem/19595
题意:求1~n之间共有多少对互质的数。
用欧拉函数 (欧拉筛法) 复杂度 O(nloglogn)
在转化为有多少对时,(1,1)被算了两次,所以减去1次
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define pi acos(-1)
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int, int> P;
const int maxn = 5e4 + 5;
// phi[i]表示小于等于i且与i互质的正整数的个数
int phi[maxn];
int sum[maxn];
void Euler() //欧拉筛法
{
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for (int i = 2; i < maxn; i++){
if (phi[i]) continue;
for (int j = i; j < maxn; j += i){
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
sum[0] = 0;
for (int i = 1; i < maxn; i++)
sum[i] = sum[i-1] + phi[i];
}
int main(void)
{
// freopen("C:\\Users\\wave\\Desktop\\NULL.exe\\NULL\\in.txt","r", stdin);
int n, i, j, k;
Euler();
while (cin >> n && n)
{
printf("%d\n", sum[n]*2 - 1);
}
return 0;
}
本文介绍了一种利用欧拉函数计算1到n区间内互质数对数量的方法,采用欧拉筛法实现,复杂度为O(nloglogn)。通过具体代码示例展示了如何快速有效地进行计算。
1555

被折叠的 条评论
为什么被折叠?



