UVA 10820 send a table
数论欧拉phi打表题
题意
大意概述:
问题可以转化。
根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1)。
设f(n)为 集合S{(x, y) | x<y且x、y互素} 的个数,则所求答案为2f(n)+1
f(n)表达式为:
代码:
// Created by user on 2020/5/15.
// Copyright © 2020 user. All rights reserved.
//
#include <iostream>
#include <cstdio>
using namespace std;
int phi[50005];
int oula(int op){
int res=op;
int x = op;
for(int i=2;i*i<=op;i++){
if(op % i == 0){
res = res / i * (i-1);
while(x % i ==0) x /= i;
}
}
if(x>1) res = res/x*(x-1);
return res;
}
int table_oula(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(phi[i]==0)
for(int j=i;j<=n;j+=i){
if(phi[j]==0) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
return 0;
}
int main(){
int n;
while(scanf("%d",&n)){
if(n==0) break;
int ans=0;
for(int i=1;i<=n;i++) phi[i]=0;
/*for(int i=2;i<=n;i++){
ans+=oula(i);
}*/
table_oula(n);
for(int i=2;i<=n;i++){
ans+=phi[i];
}
printf("%d\n",2*ans+1);
}
return 0;
}
分别算每一个小于n的数的欧拉时间太长,过不了。
只能像素数筛法那样,处理出来素数表才可以。