HYSBZ-2818: Gcd
2017-08-24 10:04
393 查看
2818: Gcd
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6160 Solved: 2725
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
Input
一个整数NOutput
如题Sample Input
4Sample Output
4HINT
hint对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
思路:莫比乌斯简单应用。可以参考http://www.cnblogs.com/chenyang920/p/4811995.html
弄懂之后,就是求GCD(x/p,y/p)==1的对数,p就是x,y的最大公约数(p为素数)。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAX=1e7+5;
int all;
int phi[MAX]; //欧拉函数
int u[MAX]; //莫比乌斯系数表
int d[MAX]; //d[i]=i的因子个数
int isp[MAX]; //是否是素数
int pr[MAX]; //素数表
void init()
{
u[1]=phi[1]=d[1]=1;
all=0;
for(int i=2;i<=MAX;i++)
{
if(!isp[i])
{
pr[all++]=i;
u[i]=-1;
phi[i]=i-1;
isp[i]=i;
d[i]=2;
}
for(int j=0;j<all&&i*pr[j]<=MAX;j++)
{
if(i%pr[j]==0)
{
u[i*pr[j]]=0;
phi[pr[j]*i]=phi[i]*pr[j];
isp[i*pr[j]]=isp[i]*pr[j];
d[i*pr[j]]=d[i/isp[i]]*(d[isp[i]]+1);
break;
}
u[i*pr[j]]=-u[i];
phi[pr[j]*i]=phi[i]*(pr[j]-1);
isp[i*pr[j]]=pr[j];
d[i*pr[j]]=2*d[i];
}
}
}
int main()
{
init(); //模版
int n;
while(scanf("%d",&n)!=EOF)
{
long long ans=0;
for(int j=0;j<all&&pr[j]<=n;j++)
{
for(int i=1;i<=n/pr[j];i++)ans+=(long long)u[i]*(n/pr[j]/i)*(n/pr[j]/i);
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- HYSBZ - 2818(gcd(n,m)为素数的对数
- HYSBZ - 2818(gcd(n,m)为素数的对数
- HYSBZ 2818 Gcd
- HYSBZ - 2818(gcd(n,m)为素数的对数
- ACM学习历程—HYSBZ 2818 Gcd(欧拉函数 || 莫比乌斯反演)
- Gcd HYSBZ - 2818
- BZOJ2818: Gcd 欧拉函数求前缀和
- bzoj2818 Gcd
- BZOJ 2818: Gcd( 欧拉函数 )
- BZ OJ 2818 Gcd (欧拉函数)
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
- 【BZOJ2818】Gcd,数论练习之欧拉筛
- 【BZOJ-2818】Gcd 线性筛
- bzoj 2818: Gcd
- bzoj 2818 gcd 线性欧拉函数
- 【BZOJ】2818 Gcd
- bzoj 2818: Gcd 线性筛求欧拉函数
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes筛)
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
- 【BZOJ2818】Gcd(莫比乌斯反演)