您的位置:首页 > 其它

Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛

2016-03-16 18:06 267 查看

2818: Gcd

Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 3241 Solved: 1437
[Submit][Status][Discuss]

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

Source

湖北省队互测

题解:

莫比乌斯函数或欧拉函数。

莫比乌斯函数详见 Popoqqq的课件 (Orz Po姐)

之后就自己推公式吧。。。

莫比乌斯函数:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10000010
#define LL long long
bitset<MAXN> vis;
int N,prime[670010],phi[MAXN],tot;
LL qz[MAXN];
int read()
{
int s=0,fh=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
return s*fh;
}
void geteular()
{
int i,j;
phi[1]=1;tot=0;
for(i=2;i<=N;i++)
{
if(vis[i]==0)
{
prime[++tot]=i;
phi[i]=i-1;
}
for(j=1;j<=tot&&prime[j]*i<=N;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
phi[prime[j]*i]=phi[prime[j]]*phi[i];
}
}
}
void Qz()
{
qz[0]=qz[1]=0;
for(int i=2;i<=N;i++)qz[i]=qz[i-1]+phi[i];
}
int main()
{
int i,n;
LL ans=0;
N=read();
geteular();
Qz();
for(i=1;i<=tot;i++)
{
n=N/prime[i];
ans+=(qz
*2+1);
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: