[BZOJ2818] Gcd

本篇介绍了一个算法问题:给定整数N,求解1≤x,y≤N且GCD(x,y)为素数的数对(x,y)的数量。通过枚举素数并利用欧拉函数计算互质数对,最终得出答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Gcd

Time Limit: 10 Sec Memory Limit: 256 MB

Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.

Input

一个整数N

Output

如题

Sample Input

4

Sample Output

4

HINT

对于样例(2,2),(2,4),(3,3),(4,2)

1<=N<=10^7

Source

湖北省队互测

题解

  • gcd(x,y)=k,k
  • gcd(xk,yk)=1

  • k,ans=f[yk],f[i]i,f[i]=φ(i)
  • ans=ans2
  • (2,2)(3,3)(5,5)...ans=anslen
  • x=1ny=1n[gcd(x,y)=P]=x=1n/Py=1n/P[gcd(x,y)=1]=2i=2n/P[ϕ(i)+1]
var
 check:array[0..10000005]of boolean;
 phi,prime:array[0..10000005]of longint;
 sum:array[0..10000005]of int64;
 i,j,len,n:longint;
 ans:int64;
begin
 readln(n); len:=0; phi[1]:=1;
 for i:=2 to n do
  begin
   if check[i]=false
   then begin inc(len); prime[len]:=i; phi[i]:=i-1; end;
   for j:=1 to len do
    begin
     if i*prime[j]>n
     then break;
     check[i*prime[j]]:=true;
     if i mod prime[j]=0
     then begin phi[i*prime[j]]:=phi[i]*prime[j]; break; end
     else phi[i*prime[j]]:=phi[i]*(prime[j]-1);
    end;
  end;
 for i:=1 to n do
  sum[i]:=sum[i-1]+phi[i];
 ans:=0;
 for i:=1 to len do
  inc(ans,sum[n div prime[i]]);
 ans:=ans*2-len;
 writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值