题意:
求区间[1-n]的所有互质的对的对数,其中(2,3)与(3,2)记为两对
思路:
筛法求救欧拉函数
求出y以前与其互斥的x,用p记录
对于求n以前与其互斥的数的个数,有函数n/i*(i-1)/j(j-1)...其中i, j为组成n的质因子
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
const int maxn = 50000;
int p[maxn+5];
void init() {
memset(p, 0, sizeof(p));
p[1] = 1;
for(int i=2; i<=maxn; i++) {
if(!p[i])//未计算过的质因子
for(int j=i; j<=maxn; j+=i) {
if(!p[j]) {//如果没计算过,即这是第一个出现的因子
p[j] = j;
}//如果计算过则之前计算的质因子和后来出现的累积则可达到公式的效果
p[j] = p[j]/i*(i-1);//j是i的倍数,i就是组成j的质因子
}
}
}
int main() {
int n;
init();
while(scanf("%d", &n) && n) {
int ans = 0;
for(int i=1; i<=n; i++)
ans += p[i];
ans = ans*2-1;
printf("%d\n", ans);
}
return 0;
}