Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
4
Sample Output
4
HINT
hint
对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
数论题心累。。总之就是各种变换。。
见http://wzimpha.sinaapp.com/archives/499#comment-41
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int mu[10000001],prime[10000001];
int g[10000001];
int sum[10000001];
bool check[10000001];
int n;
int tot;
inline void findmu()
{
memset(check,false,sizeof(check));
mu[1]=1;
int i,j;
for(i=2;i<=n;i++)
{
if(!check[i])
{
tot++;
prime[tot]=i;
mu[i]=-1;
g[i]=1;
}
for(j=1;j<=tot;j++)
{
if(i*prime[j]>n)
break;
check[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
g[i*prime[j]]=mu[i];
break;
}
else
{
mu[i*prime[j]]=-mu[i];
g[i*prime[j]]=mu[i]-g[i];
}
}
}
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+g[i];
}
int main()
{
scanf("%d",&n);
findmu();
int d,j=0;
long long ans=0;
for(d=1;d<=n;d=j+1)
{
j=n/(n/d);
ans+=(long long)(sum[j]-sum[d-1])*(n/d)*(n/d);
}
printf("%lld\n",ans);
return 0;
}