bzoj 2818 Gcd(欧拉函数)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 2818 Gcd(欧拉函数)相关的知识,希望对你有一定的参考价值。

 

【题目链接】

 

    http://www.lydsy.com/JudgeOnline/problem.php?id=2818

 

【题意】

 

    问(x,y)为质数的有序点对的数目。

 

【思路】

 

  定义f[i]表示i之前(x,y)=1的有序点对的数目,则有递推式:

          f[1]=1

          f[i]=f[i-1]+phi[i]*2

  我们依次枚举小于n的所有素数,对于素数t,(x,y)=t的数目等于(x/t,y/t),即f[n/t]。

 

【代码】

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 typedef long long ll;
 7 const int N = 1e7+10;
 8 
 9 int su[N],tot,phi[N];
10 ll f[N];
11 
12 void get_pre(int n)
13 {
14     phi[1]=1;
15     for(int i=2;i<=n;i++) if(!phi[i]) {
16         su[++tot]=i;
17         for(int j=i;j<=n;j+=i) {
18             if(!phi[j]) phi[j]=j;
19             phi[j]=phi[j]/i*(i-1);
20         }
21     }
22     f[1]=1;
23     for(int i=2;i<=n;i++) f[i]=f[i-1]+2*phi[i];
24 }
25 
26 int n;
27 
28 int main()
29 {
30     scanf("%d",&n);
31     get_pre(n);
32     ll ans=0;
33     for(int i=1;i<=tot;i++)
34         ans+=f[n/su[i]];
35     printf("%lld\n",ans);
36     return 0;
37 }

 

以上是关于bzoj 2818 Gcd(欧拉函数)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2818 GCD 数论 欧拉函数

[BZOJ2818] Gcd (数论,欧拉函数,线性筛)

BZOJ2818 Gcd 欧拉函数

BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

[bzoj2818]: Gcd

bzoj 2818: Gcd