题目描述

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

输入

一个整数

1<=N<=1000000

输出

一个整数

样例输入

4

样例输出

4

提示

【样例解释】

(2,2),(2,4),(3,3),(4,2)

其实是做过的,我们知道,欧拉函数就是找在n以内与n互质的数,那么我们这样思考,设有一个数是x是在y范围以内与y互质的,就一定满足:

gcd(y , x) = 1

那么,如果我们同时将n乘上一个素数,如3,则就一定有:

gcd( 3*y , 3*x ) = 3

那么只要保证y*3不大于n,那么y及其y以内的数都可以满足咯,所以最后的答案就是:

其中pn为n以内质数个数,prime存的是质数。

为什么要乘2呢,因为反过来也是一种情况

为什么要加1呢?因为(n/prime[i] , n/prime[i])也是一种情况,但是只能算一遍,且欧拉函数算的是小于n/prime[i]的

可以用前缀和

代码:


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n ;
#define ll long long
const int MAXN = 1e7 + 3;
int prime[MAXN] , pn;
ll phi[MAXN];
bool vis[MAXN];
void pr(){
    for( int i = 2 ; i <= n ; i ++ ){
        if( !vis[i] ){
            prime[++pn] = i;
            phi[i] = i - 1;
        }
        for( int j = 1 ; j <= pn && 1ll * i * prime[j] <= n ; j ++ ){
            vis[i*prime[j]] = 1;
            if( i % prime[j] == 0 ){
                phi[i*prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i*prime[j]] = phi[i] * ( prime[j] - 1 );
        }
    }
    for( int i = 2 ; i <= n ; i ++ )
        phi[i] = phi[i] + phi[i-1];
}
int main(){
    scanf( "%d" , &n );
    pr();
    ll ans = 0;
    for( int i = 1; i <= pn ; i ++ ){
        ans = ans + phi[n/prime[i]] * 2 + 1;
    }
    printf( "%lld" , ans );
    return 0;
}
 
 

--------------------- 

作者:BIT_jzx 

原文:https://blog.csdn.net/weixin_43823476/article/details/89077146

gcd(数论)的更多相关文章

  1. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  2. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  3. BZOJ 4305: 数列的GCD( 数论 )

    对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...

  4. hdu 4983 Goffi and GCD(数论)

    题目链接:hdu 4983 Goffi and GCD 题目大意:求有多少对元组满足题目中的公式. 解题思路: n = 1或者k=2时:答案为1 k > 2时:答案为0(n≠1) k = 1时: ...

  5. 【bzoj2818】: Gcd 数论-欧拉函数

    [bzoj2818]: Gcd 考虑素数p<=n gcd(xp,yp)=p 当 gcd(x,y)=1 xp,yp<=n满足条件 p对答案的贡献: 预处理前缀和就好了 /* http://w ...

  6. UVA 10951 - Polynomial GCD(数论)

    UVA 10951 - Polynomial GCD 题目链接 题意:给定两个多项式,求多项式的gcd,要求首项次数为1,多项式中的运算都%n,而且n为素数. 思路:和gcd基本一样,仅仅只是传入的是 ...

  7. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

  8. luoguP1029 最大公约数和最小公倍数问题 [gcd][数论]

    题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...

  9. BZOJ 2820: YY的GCD | 数论

    题目: 题解: http://hzwer.com/6142.html #include<cstdio> #include<algorithm> #define N 100000 ...

随机推荐

  1. vue大型电商项目尚品汇(后台篇)day01

    开始我们后台篇的内容,前面处理了一些事情,去学校完成授位仪式,由校长授位合影,青春不留遗憾,然后还换了一个电脑,征战了四年的神船终于退役了,各种各样的小毛病是真的烦人. 现在正式开始后台篇的内容,做了 ...

  2. .NET中的并发操作集合

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月1日. 一.并发集合 .NET中提供了相当多线程安全的集合,它们都在System.Collections.Concurrent命名 ...

  3. 打字练习-编程语言关键字系列-html

    以下是小编整理的部分html关键字,专门给有需要的朋友进行打字练习用,通过打字练习的方式,既提高了打字速度,又可以熟悉html关键字~~~ www, url, http, W3C, html, htm ...

  4. Oracle账户被锁(the account is locked)

    问题: 安装好Oracle之后用scott登录报错:ERROR:ORA-28000:the account is locked 解决方案: Win+R打开命令行输入:sqlplus 使用system账 ...

  5. 重学ES系列之字符串方面的处理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【RPA之家转载RPA创新产业峰会回看】机器人流程自动化专利态势报告

    [RPA之家转载RPA创新产业峰会回看]机器人流程自动化专利态势报告 自动化的一个专利情况的监测,就是全球监测的情况.今天我可能给大家汇报的主要是三个方面,第一个方面就是讲一下全球投资智能化的专利的一 ...

  7. jenkins部署docker

    1. 先在jenkins上配置拉取代码部分,需要在git上找到项目位置,直接复制url即可 http://192.168.0.161:3000/IT-Insurance/Back.Test-Walle ...

  8. C++库的随机数生成

    C++库为我们提供了很多生成随机数的方法. 使用C的随机数生成法 先学过C语言,或者仅仅用C++做算法的人.对rand()是非常熟悉了.这个函数没有参数,生成0到RAND_MAX的随机数(RAND_M ...

  9. docker-compose: 未找到命令,安装docker-compose

    1.安装扩展源 sudo yum -y install epel-release 2.安装python-pip模块 sudo yum install python-pip 3.通过命令进行安装 cd ...

  10. 反向传播神经网络(BP)

    实验部分: ①输入.输出矢量及问题的阐述 由题意输入变量取值范围为e={-2,-1,0,1,2}和ec={-2,-1,0,1,2},则输入矢量有25种情况,分别如下所示: 则由T=int((e+ec) ...