题目大意

  给你 \(n\),求

\[\sum_{a=1}^n\sum_{b=1}^n\sum_{c=1}^n[\frac{1}{a}+\frac{1}{b}=\frac{1}{c}][\gcd(a,b,c)=1]\\
\]

  \(n\leq {10}^{12}\)

题解

\[\begin{align}
&\sum_{a=1}^n\sum_{b=1}^n\sum_{c=1}^n[\frac{1}{a}+\frac{1}{b}=\frac{1}{c}][\gcd(a,b,c)=1]\\
=&\sum_{a=1}^n\sum_{b=1}^n\sum_{c=1}^n[c(a+b)=ab][\gcd(a,b,c)=1]\\
=&\sum_{a=1}^n\sum_{b=1}^n[(a+b)\mid ab][\gcd(a,b,c)=1]\\
\end{align}
\]

  通过打表可以发现,一对数 \(a,b(a\leq b)\) 满足条件的充要条件是 \(b\leq n\) 且 \(\frac{a}{\gcd(a,b)}+\frac{b}{\gcd(a,b)}=\gcd(a,b)\)

  证明:

  若 \(\gcd(a,b)=1\),则 \(\gcd(a+b,ab)=1\)

  记 \(g=\gcd(a,b),a=ga',b=gb'\),则

\[a+b=g(a'+b')\\
ab=g^2a'b'\\
\frac{ab}{a+b}=\frac{g^2a'b'}{g(a'+b')}=\frac{ga'b'}{a'+b'}\\
\]

  所以 \((a'+b')\mid g\)

  若 \(a'+b'\neq g\),则 \(\gcd(a,b,c)=\frac{g}{a'+b'}\),所以 \(a'+b'=g\) 所以 \(a=a'(a'+b'),b=b'(a'+b'),c=a'b'\)

解法一

  记 \(x=a',y=b'\)

\[\begin{align}
ans&=\sum_{x=1}^n\sum_{y=x}^n[xy+y^2\leq n]\gcd(x,y)=1\\
&=\sum_{d=1}^\sqrt{n}\mu(d)\sum_{x=1}\sum_{y=x}[xy+y^2\leq \frac{n}{d^2}]\\
&=\sum_{d=1}^\sqrt{n}\mu(d)\sum_{y=1}\min\left(\left\lfloor\frac{\left\lfloor\frac{n}{d^2}\right\rfloor-y^2}{y}\right\rfloor,y\right)
\end{align}
\]

  时间复杂度:\(O(\sqrt n\log n)\)

解法二

  \(a+b=g^2\)

  枚举 \(g\),那么 \(\gcd(g,a')=1\)

  当 \(g\) 比较小的时候 \((1\leq g\leq \sqrt n)\),\(a'\) 有 \(\varphi(g)\) 种取值,可以直接筛

  当 \(g\) 比较大的时候 \((\sqrt n<g<\sqrt{2n})\),

\[\sum_{i=1}^\frac{n}{g}[\gcd(g,i)=1]\\
=\sum_{d\mid g}\mu(d)\lfloor\frac{n}{gd}\rfloor
\]

  可以暴力枚举因子。

  时间复杂度:\(O(\sqrt n\log n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUG
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int check(int x,int y)
{
return x*y%(x+y)==0;
}
const int N=1000010;
int b[N];
int pri[N];
int miu[N];
int cnt;
int main()
{
// open("loj6482");
ll n;
scanf("%lld",&n);
miu[1]=1;
for(int i=2;i<=1000000;i++)
{
if(!b[i])
{
pri[++cnt]=i;
miu[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<=1000000;j++)
{
b[i*pri[j]]=1;
if(i%pri[j]==0)
break;
miu[i*pri[j]]=-miu[i];
}
}
ll ans=0;
for(int i=1;(ll)i*i<=n;i++)
if(miu[i])
{
ll s=0;
for(int j=1;;j++)
{
int z=min((n/i/i-(ll)j*j)/j,(ll)j);
if(z<=0)
break;
s+=z;
}
ans+=miu[i]*s;
}
ans=ans*2-1;
printf("%lld\n",ans);
// int ans=0;
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// if(gcd(i,j)==1&&i*(i+j)<=n&&j*(i+j)<=n)
// ans++;
// printf("%d\n",ans);
// return 0;
// int n=1000;
// for(int i=1;i<=n;i++)
// for(int j=i;j<=n;j++)
// if(gcd(i,j)==1&&check(i*(i+j),j*(i+j))&&gcd(gcd(i*(i+j),j*(i+j)),i*j)==1)
// if(j*(i+j)<=n)
// printf("%d %d %d\n",i*(i+j),j*(i+j),i*j);
// return 0;
// for(int i=1;i<=n;i++)
// for(int j=i;j<=n;j++)
// if(i*j%(i+j)==0)
// {
// int z=i*j/(i+j);
// if(gcd(gcd(i,j),z)==1)
// printf("%d %d %d %d %d %d\n",i,j,z,gcd(i,j),i/gcd(i,j),j/gcd(i,j));
// }
// return 0;
}

【LOJ6482】LJJ 爱数数 数论的更多相关文章

  1. 「LOJ6482」LJJ爱数数

    「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...

  2. P4844 LJJ爱数数 数论

    思路: 化简后得到(a+b)c=ab,设g=(a,b),A=a/g,B=b/g,则g(A+B)c=ABg^2,即(A+B)c=ABg 由题目已知条件:(a,b,c)=1,即(g,c)=1,g|(A+B ...

  3. P4844 LJJ爱数数

    题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...

  4. LJJ爱数数

    LJJ爱数数 求\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\epsilon(gcd(i,j,k))(\frac{1}{i}+\frac{1}{j}==\frac{1} ...

  5. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  6. [BJOI2019]勘破神机(斯特林数,数论)

    [BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...

  7. [HZOI 2016]我们爱数数

    [HZOI 2016]我们爱数数 题目大意: 一张圆桌,每个位置按顺时针从\(1\)到\(n\)编号.有\(n\)个人,编号从\(1\)到\(n\).如果编号为\(i\)的人坐到了编号为\(i\)的位 ...

  8. COJ 0036 数数happy有多少个?

    数数happy有多少个? 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 图图是个爱动脑子.观察能力很强的好学生.近期他正学英语 ...

  9. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  10. BZOJ3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 322  Solved: 188[Submit][Status] ...

随机推荐

  1. [转]Blue Prism Login Agent 使用指导手册

    本文转自:https://cloud.tencent.com/developer/news/83035 咳!咳!咳! 第一篇RPA技术文,还是贼拉鸡冻.各位大侠要多多支持啊 1.Login Agent ...

  2. jQuery里面的常用的事件和基础动画的实现

    一:了解jquery里面常用的事件 二:了解基础动画的实现 1:加载DOM 在JavaScript中使用window.onload事件作为窗体加载事件(它在页面所有数据加载完成之后才会执行) 在jQu ...

  3. MyBatis缓存策略

    MyBatis 提供了一级缓存和二级缓存策略,一级缓存是作用在SqlSession级别上的,而二级缓存则是作用在Mapper级别上的( 即作用在 namespace上),MyBatis 默认是开启的一 ...

  4. W3C 代码标准规范

    W3C通过设立领域(Domains)和标准计划(Activities)来组织W3C的标准活动,围绕每个标准计划,会设立相关的W3C工作组织(包括工作组.社区组.商务组等).W3C会根据产业界的标准需求 ...

  5. 第十二课 CSS基本选择器 css学习2

    基础选择器一.标签选择器(元素选择器)标签选择器是指用HTML标签名称作为选择器,按标签名称分类语法:标签名{属性1:属性值1;属性2:属性值2;属性3:属性值3;} 二.类选择器1.类选择器使用&q ...

  6. Nginx日志常用统计分析命令

    IP相关统计 统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) gr ...

  7. 浅谈AndroidGPU过度绘制、GPU呈现模式分析及相关优化

    在真机设备下有一个开发者选项,这个大家都知道,我们最常用的就打开'USB调试'功能,方便真机调试. 在这开发者选项中还有个选项,'调试GPU过度绘制' 这里选择第二个选项'显示过度绘制区域' 可以看到 ...

  8. java:数据结构(二)栈的应用(进制转换全收集)

    说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...

  9. Spring AOP 整理笔记

    一.AOP概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 利用AOP可以对业务逻辑的各 ...

  10. PM领导能力成熟度2级

    人生如戏,大幕拉开,他走上舞台,饰演PM一角. 从技术岗位迈向管理岗位的第一步,对大多数像他一样的新晋PM来说,并不轻松.技术知识与经验是他曾经的主要才能与成功基础,而从成熟度一级开始,身为管理者的他 ...