题意:给定 \(n\),求方程 \(\frac 1 a - \frac 1 b=\frac 1 n\) 的所有解,且解必须满足 \(\gcd(a,b,n)=1\)。

以下内容搬运自官方题解:

转化一下:

\[bn=a(b+n)
\]
\[a=\frac {bn} {b+n}
\]

根据 \(\gcd(a,b,n)=1\),有:

\[\gcd(\frac {bn} {b+n},b,n)=\gcd(\frac {bn} {b+n},\gcd(b,n))=1
\]

接下来设 \(b=x \times \gcd(b,n),n=y \times \gcd(b,n)\),那么一定有 \(\gcd(x,y)=1\)。

于是:

\[\gcd(\frac {xy} {x+y} \times \gcd(b,n),\gcd(b,n))=1
\]
\[\gcd(b,n)|(x+y)
\]

而 \(\gcd(xy,x+y)=1,\frac {xy} {x+y} \times \gcd(b,n)\) 是整数,所以有 \((x+y)|\gcd(b,n)\)。

于是 \(x+y=\gcd(b,n),b+n=\gcd(b,n) \times (x+y) = \gcd(b,n)^2\)。

相当于求方程 \(x+n=\gcd(x,n)\)。(这里的 \(x\) 在上面是 \(b\))

下面为了方便,设 \(\gcd(x,n)=d,c=dk\)。

\[d^2=dk+x
\]
\[x=d \times (d-k)
\]

然后对于 \(d\),枚举可行的 \(k\),最后检查一下是否合法就行。

以上内容搬运自官方题解。

检查是否合法的瓶颈在于,计算 \(\gcd(x,c)=\gcd(d(d-k),c)=\gcd(d(d-k),dk)=d \times \gcd(d-k,k)\)。

这里的 \(d-k\) 和 \(k\) 一定有一个数不大于 \(\sqrt n\),所以根据 \(\gcd(a,b)=\gcd(a \bmod b,b)\),可以直接预处理一个 \(\sqrt n \times \sqrt n\) 的表。

再往下推,发现实际上是判断 \(d\times \gcd(d-k,k)=d\),也就是判断 \(d\) 和 \(k\) 是否互质,所以打表可以使用一个 bool 类型的数组来降低常数。

到这里,复杂度已经变成 \(O(n\log n+T)\) 的了。在加强版中,这个做法只跑了 1s,并且卡掉了 \(O(n+T\sqrt n)\) 的暴力,还在原版跑到了300ms

#include<cstdio>
#include<vector>
typedef unsigned uint;
typedef unsigned long long ull;
const uint M=2e6;
uint T,mx,n[100005],ans1[M+5];bool _check[1420][1420];
ull ans[M+5],ans2[M+5];
inline ull min(const ull&a,const ull&b){
return a>b?b:a;
}
signed main(){
register uint i,j,x;
scanf("%u",&T);_check[0][1]=true;
for(i=1;i<=1415;++i)_check[1][i]=true;
for(i=2;i<=1415;++i){
for(x=0,j=i;j<=1415;++j){
_check[i][j]=_check[x][i];
if(++x==i)x=0;
}
}
for(i=1;i<=T;++i)scanf("%u",n+i),mx=n[i]>mx?n[i]:mx;
for(i=1;i<=mx;++i)ans2[i]=0x7f7f7f7f7f7f7f7f;
for(i=1;i<=mx;++i){
for(j=1,x=i;j<=i&&x<=mx;++j,x+=i){
if(_check[i%j][j])ans2[x]=min(ans2[x],1ull*i*(i-j)),++ans1[x];
}
}
for(ans1[i=1]=0;i<=mx;++i)ans1[i]+=ans1[i-1];
for(i=1;i<=T;++i)printf(n[i]==1?"0\n":"%u %llu\n",ans1[n[i]],ans2[n[i]]);
}

LGP7847题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Android利用zxing生成二维码

    感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...

  2. Java线程--Callable使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871727.html Java线程--Callable使用 Callable和Runnabl ...

  3. shell基础——数组

    定义数组 #小括号,空格 arr=(v1 v2 v3) arr=(`ls`) 打印数组 echo ${arr[0]} #下标从0开始 echo ${arr[*]} #整个数组 echo ${arr[@ ...

  4. notepad++颜色属性解释

    Global Styles Indent guideline style  缩进参考线的颜色Brace highlight style 鼠标指针在框架左右时框架的颜色(如css中{}   js中的() ...

  5. Pytest介绍

    Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍,它 ...

  6. Linux专项之Apache

    day01:apache服务框架 前期准备 1.虚拟机上网 实验一:展示默认页面 1.安装软件(httpd) yum search httpd yum install -y httpd 2.关闭防火墙 ...

  7. HTTP流量神器Goreplay核心源码详解

    摘要:Goreplay 前称是 Gor,一个简单的 TCP/HTTP 流量录制及重放的工具,主要用 Go 语言编写. 本文分享自华为云社区<流量回放工具之 goreplay 核心源码分析> ...

  8. JVM调优——JVM监控工具jvisualvm的使用及GC插件安装

    一.前言 在高并发的场景下,我们网站的的访问性能会降低,我们怎么优化,这是个问题!天天听JVM调优,实际上还是不知道怎么调优,调优也是看着网上说的修改一下JVM的堆的空间等等进行的.实际上我们应该在压 ...

  9. spring循环依赖的产生与解决

    1.循环依赖的产生 在spring中对象默认都是单例的 ,意味整个容器中只有一个该类的对象. 如图,B类有一个属性a,A类有一个属性b.当B类创建对象时,要给a属性赋值:当A类创建对象时,要给b属性赋 ...

  10. mysql linux 导出数据

    1.mysql -hxx -uxx -pxx -e 'select "" name from a' db数据库 > file 2.导出的文件notepad++打开 3.新建e ...