看到这是一道紫题还是和gcd有关的才点进来(毕竟数论只会gcd).

前置芝士

  1. 质数**(又称素数):因数只有1和本身,但是很特殊的1不是一个质数.
  2. gcd**:欧几里得算法,又称辗转相除法,可以在约为O(LogN)的时间复杂度内求出两个数的最大公约数(N为两个数中大的那个数,在两数为相邻的斐波那契数时最慢,具体不证明其实就是我不会).
  3. 欧拉函数**:一个非常基本的数论函数,是一个积性函数(虽然本题并没有考到),欧拉函数可以表示为\(\varphi(x)\),表示小于x的自然数中与x互质的数的个数(具体求法下文会讲到).

推导公式

很明显,直接暴力需要O(N^2)的时间发咋读但是N有1e7肯定是会T的,所以需要从gcd(a,b)为一个质数入手.

当\(gcd(a,b)==1\)时不难发现\(gcd(a*p,b*p)==p\)(p为任何自然数时都成立),于是乎可以先把0~N中的素数筛出来.

那么下面要怎么知道一个素数可以产生几对符合条件的a,b呢?

可以发现\(max(a,b)*p\leq N\Rightarrow max(a,b)\leq \dfrac {N}{p}\)因为a,b都为整数,所以\(max(a,b)\leq \lfloor\dfrac {N}{p}\rfloor\),于是就要知道小于p的互质的数对的个数了,拿出前置芝士中的欧拉函数,于是小于p的数的对数\(=2*\sum ^{\tiny\lfloor\dfrac {N}{p}\rfloor}_{i=1}\varphi \left( i\right)\)(因为如(1,2)和(2,1)同时成立,所以需要乘2),每次都要求自然还是会T,所以需要用到前缀和优化一下.

具体做法

欧拉函数的具体实现:(本人太菜,只会用埃氏筛)

对于x不是质数\(\varphi(x)=x*\prod ^{n}_{i=1}(1-\dfrac {1}{p_{i}})\)(其中\(p_{i}\)为为x质因数,n为x的质因数的个数)

x为质数时\(\varphi(x)=x-1\),其中十分特殊的\(\varphi(1)=1\).

这样可以直接套入埃氏筛中将所有\(1\leq x\leq N\)的\(\varphi(x)\)求出,再用一个sum数组统计起来.

如果还不是很了解可以康康例题.

代码

#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int maxN=1e7+5;
int N;
double phi[maxN];
bool boo[maxN];
long long sum[maxN];//注意开long long
int main()
{
scanf("%d",&N);
rap(i,1,N)
{
boo[i]=1;
phi[i]=i;//先赋值为i方便处理
}
boo[1]=0;//不是质数
rap(i,2,N)//埃氏筛的部分
if(boo[i])
{
phi[i]=i-1;
rap(j,2,N/i)
{
boo[i*j]=0;
phi[i*j]*=1.0-1.0/i;//求出欧拉函数的值
}
}
sum[1]=1;//1时因为只有(1,1)所以不用乘二
rap(i,2,N)
sum[i]=sum[i-1]+1ll*((int)phi[i])*2;//用前缀和优化
long long answer=0;//注意long long
rap(i,2,N)
if(boo[i])answer+=sum[N/i];//把每个质数所带来的(a,b)全部相加
printf("%lld",answer);//输出answer
return 0;
}

数论题的题解好难写

「Luogu P2568 GCD」的更多相关文章

  1. Luogu P2568 GCD

    我们首先发现这样肯定是做不了的,所以我们枚举为\(gcd(x,y)=d\)的\(d\) 然后考虑以下的性质: \(gcd(x,y)=1 \Leftrightarrow gcd(px,py)=p(p为素 ...

  2. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  3. 「Luogu P3680 凸轮廓线」

    一道神奇的计算几何题 前置芝士 正三角形,正方形,圆:什么,您都会,那真是太好了. 三角函数的运用:因为我不是很想在这一块写太多,具体可以自行百度. 推导公式 对于一串是圆和正方形开头和结尾时是十分好 ...

  4. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  5. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  6. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  7. Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)

    Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...

  8. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  9. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

随机推荐

  1. Python web在IIS上发布方法和原理

    Python web应用想要发布使用iis发布有两种方式,这篇文章就为大家介绍一下这两种方式的具体实现: 1.配置HttpPlatform程序 HttpPlatform 模块将套接字连接直接传递到独立 ...

  2. VBA 学习笔记 - 输入框

    学习资料 https://www.yiibai.com/vba/vba_input_box.html 输入框 InputBox 函数说明 提示用户输入值.当输入值后,如果用户单击确定 按钮或按下键盘上 ...

  3. 【代码总结】GD库中简单的验证码

    大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...

  4. 吴裕雄 PYTHON 神经网络——TENSORFLOW 学习率的设置

    import tensorflow as tf TRAINING_STEPS = 10 LEARNING_RATE = 1 x = tf.Variable(tf.constant(5, dtype=t ...

  5. 一大波新款iPhone跟安卓厂商抢夺5G市场

    据外媒最新报道称,苹果已经基本完成了今年iPhone的推新阵容,其发布的多款新机中,将涵盖399美元-1149美元的售价区间,特别是5G手机,起步价可能会很亲民,其目的在于进一步占据市场. 今年苹果将 ...

  6. springboot 打包成jar

    1.pom.xml配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  7. 于elasticsearch-rest-high-level-client 操作 Es

    安装Java:要求JDK为1.8及以上版本. 创建阿里云Elasticsearch实例:实例版本要求大于等于elasticsearch-rest-high-level-client的版本.本文创建一个 ...

  8. 变量的注释(python3.6以后的功能)

    有时候导入模块,然后使用这个变量的时候,却没点出后面的智能提示.用以下方法可以解决:https://www.cnblogs.com/xieqiankun/p/type_hints_in_python3 ...

  9. Spring学习(一)

    搭建环境 1.创建普通的Java工程 2.添加相应的jar包,下载链接:https://files.cnblogs.com/files/AmyZheng/lib.rar,此外,为了打印信息,我们还需要 ...

  10. (任意进制转换)将 r 进制数转成 k 进制数

    我们知道任意进制转换为十进制,都是乘以基数的多少次方,然后相加: 十进制转换为任意进制,都是除以基数,然后倒着取余数: 所以这里是用十进制数中转,实现任意进制数的转换 #include<iost ...