题意:输入n,求【1,n】中有多少个整数使得 LCM( i , n) < n * i
思路:
LCM( a * b ) = a * b /gcd(a,b)
当gcd(a,b)=1时不满足 LCM( i , n) < n * i ,即答案等于 n - n的欧拉函数值
n的欧拉函数值
可以先打表或者直接写欧拉函数
#include<stdio.h>
#define maxn 2000000
int p[maxn+1];
int oula(int a)
{
if(a==1) return 1;
int res=a;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
{
res/=i;
res*=(i-1);
while(a!=1&&a%i==0)
a/=i;
}
}
if(a!=1){
res/=a;
res*=(a-1);
}
return res;
}
void init()
{ int i,j;
for(i=1; i<=maxn; i++)
p[i]=i;
for(i=2; i<=maxn; i+=2)
p[i]/=2;
for(i=3; i<=maxn; i+=2)
if(p[i]==i)
{
for(j=i; j<=maxn; j+=i)
p[j]=p[j]/i*(i-1);
}
}
int main()
{
init();
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
//printf("%d\n",n-oula(n));
printf("%d\n",n-p[n]);
}
return 0;
}