UVA.10820 Send A Table (欧拉函数)
标签(空格分隔): 数论
题意分析
题面说的比较花里胡哨,最总要的是发现,需要打得的表的数字(x,y)满足gcd(x,y)=1,也就是说x,y互质。发现这个性质之后,就不是很难了。
规定x<y,可以将规模缩减一半,最后输出只需要乘2就好了,对于x=y的情况,发现只需要(1,1),故乘2后最后结果需要+1即可。
代码总览
#include <bits/stdc++.h>
#define nmax 50005
#define N 50005
#define ll long long
using namespace std;
bool check[nmax];
int prime[nmax];
int phi[nmax];
int tot;
void getphi(){
memset(check,false,sizeof check);
int tot = 0;
phi[1] = 1;
for(int i = 2;i<=N;++i) {
if(!check[i]){
prime[tot++] = i;
phi[i]= i-1;
}
for(int j = 0;j<tot;++j) {
if( i * prime[j] > N ) break;
check[ i * prime[j] ] = true;
if( i % prime[j] == 0 ) {
phi[ i * prime[j] ] = phi[i] * prime[j] ;
break;
}else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
int n;
int main(){
getphi();
while(scanf("%d",&n) != EOF){
if(n == 0) break;
ll ans = 0;
for(int i = 2;i<=n;++i){
ans+=phi[i];
}
ans = ans *2 +1;
printf("%lld\n",ans);
}
return 0;
}