【BZOJ-2818】Gcd 线性筛

2818: Gcd

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 3347  Solved: 1479
[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

湖北省队互测

Solution

首先,所求的是$\sum_{i=1}^{N}\sum_{j=1}^{N}\left [ gcd\left ( i,j \right )= p \right ]$

那么转化一下就可以得到$\sum_{i=1}^{N}\sum_{j=1}^{N}\left [ gcd\left ( \frac{i}{p},\frac{j}{p} \right )= 1 \right ]$

那么我们定义$f\left [ i \right ]$表示1~i中满足$gcd\left ( x,y \right )= 1$的个数

那么很显然可以得到 $f\left [ i \right ]= 1+2*\sum_{j=1}^{i}\varphi \left ( j \right )$

上述式子很好想,考虑$\varphi$的定义,以及$gcd\left ( a,b \right )= gcd\left ( b,a \right )$再考虑$\left ( 1,1 \right )$的情况

所以很显然,结果就是$\sum_{i=1}^{cnt}f\left [ \frac{n}{prime[i]]} \right ]$

值得注意的是,不要计算重复,具体的看代码即可

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10000010
int prime[maxn],cnt;long long phi[maxn],f[maxn];
bool flag[maxn];
void prework(int n)
{
    phi[1]=1; flag[1]=1; f[1]=1;
    for (int i=2; i<=n; i++)
        {
            if (!flag[i]) prime[++cnt]=i,phi[i]=i-1;
            for (int j=1; j<=cnt&&i*prime[j]<=n; j++)
                {
                    flag[i*prime[j]]=1;
                    if (!(i%prime[j]))
                        {phi[i*prime[j]]=phi[i]*prime[j];break;}
                    else
                        phi[i*prime[j]]=phi[i]*(prime[j]-1);
                }
        }
    for (int i=3; i<=n; i++) phi[i]+=phi[i-1];
    for (int i=2; i<=n; i++) f[i]=1+2*phi[i];
}
void work(int n)
{
    long long ans=0;
    for (int i=1; i<=cnt; i++)
        if (n/prime[i]) ans+=f[n/prime[i]];
    printf("%lld\n",ans);
}
int main()
{
    int n;
    scanf("%d",&n);
    prework(n+1); work(n);
    return 0;
}

简单数论!一点都不慌

时间: 2024-10-14 07:22:27

【BZOJ-2818】Gcd 线性筛的相关文章

bzoj 2818 gcd 线性欧拉函数

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB[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 思路:gcd(x,y)

BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes筛)

题目大意:给定整数N(N <= 1e7),求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.. 思路:推一推. 设gcd(x,y) = p,则x / p与y / p互质 问题就转化成了N / p中有多少个数互质,然后累加就可以了. =>对于任意a,b,a <= N / p,b <= N / p,且a与b互质 =>gcd(a,b) == 1 现在问题就很明显了,看到这个形式就很容易想到欧拉函数,求一下phi,算一下前缀和,累加. 注意这里求欧拉一

BZOJ 2818 Gcd 线性欧拉

题意:链接 方法:线性欧拉 解析: 首先列一下表达式 gcd(x,y)=z(z是素数并且x,y<=n). 然后我们可以得到什么呢? gcd(x/z,y/z)=1; 不妨令y>=x 则可以得到我们要的答案就是∑max(y/z)i=1phi(i) 而max(y/z)就是max(n/z): 所以只需要枚举一下质数z随便搞一下就好了,最好用前缀和记录 HINT:前缀和写树状数组的都是(*) 代码: 正常人做法1.1s #include <cstdio> #include <cstri

BZOJ 2818: Gcd

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4443  Solved: 1960[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&

BZOJ 2190 仪仗队(线性筛欧拉函数)

简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # inclu

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

传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [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,

bzoj 2818: Gcd GCD(a,b) = 素数

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1566  Solved: 691[Submit][Status] 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<=

BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2534  Solved: 1129 [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)

bzoj 2818: Gcd 歐拉函數

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1633  Solved: 724[Submit][Status] 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<=