Relatives
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 15712 Accepted: 7967
Description
Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.
Input
There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.
Output
For each test case there should be single line of output answering the question posed above.
Sample Input
7
12
0
Sample Output
6
4
題解
就是求 。
把 進行素數分解,
代碼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define ll long long
const int MAXN=5e7;
using namespace std;
int pre[MAXN],num,n;
bool vis[MAXN];
inline int read()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
void Init()
{
int N=50000;
for(int i=2;i<=N;i++)
{
if(vis[i]==0) pre[++num]=i;
for(int j=1;j<=num&&pre[j]*i<=N;j++)
{
vis[pre[j]*i]=1;
if(i%pre[j]==0) break;
}
}
}
ll phi(int x)
{
ll ans=1;
for(int i=1;i<=num;i++)
{
if(x%pre[i]==0)
{
int j=0;
while(x%pre[i]==0)
{
++j;
x/=pre[i];
}
for(int k=1;k<j;k++)
{
ans*=pre[i];
}
ans*=(pre[i]-1);
if(x==1) break;
}
}
if(x>1) ans*=(x-1);
return ans;
}
int main()
{
Init();
while(1)
{
n=read();
if(!n) break;
printf("%lld\n",phi(n));
}
return 0;