LOJ 6482

设$d = gcd(a, b)$,$xd = a$,$yd = b$,因为$\frac{1}{a} + \frac{1}{b} = \frac{a + b}{ab} = \frac{1}{c}$,所以$c(x + y)= xyd$。

因为$d$不整除于$c$,那么$d | (x + y)$,把$d$除过去,

$$\frac{x + y}{d} = \frac{xy}{c}$$

设这个式子等于$p$,如果$p$不为$1$,那么$p | x$或者$p | y$,$p$不可能同时整除$x, y$($x, y$互质),但是$p | (x + y)$,所以不成立,得到$p = 1$。

原来的条件就变成了$a + b = d^2$,$c = \frac{ab}{d^2}$,$1 \leq a,b,c \leq n$。

我们可以枚举这个$d$,然后枚举$x$,这样子只要算出和$d$互质的数的数量就可以了。

考虑一下$x$的范围,$x$满足

$$1 \leq dx \leq n$$

$$1 \leq d^2 - dx \leq n$$

那么$max(1, d - \left \lfloor \frac{n}{d} \right \rfloor)\leq x \leq min(d - 1, \left \lfloor \frac{n}{d} \right \rfloor)$。

即为求

$$\sum_{d = 1}^{\sqrt{2n}}\sum_{x = max(1, d - \left \lfloor \frac{n}{d} \right \rfloor)}^{min(d - 1, \left \lfloor \frac{n}{d} \right \rfloor)}[gcd(x, d - x) == 1]$$

有辗转相减法$gcd(x, d - x) = gcd(x, d)$。

求一定范围内的$x$,把它拆成前缀和相减的形式,现在就是要做:

$$\sum_{i = 1}^{k}[gcd(i, d) == 1]$$

$$ = \sum_{i = 1}^{k}\sum_{j | gcd(i, d)}\mu (j)$$

$$ = \sum_{i = 1}^{k}\sum_{j = 1}^{d}\mu (j)[j | d][j | i]$$

$$ = \sum_{j | d}\mu (j)\left \lfloor \frac{k}{j} \right \rfloor$$

枚举$d$的约数即可。

时间复杂度$O(\sqrt{n}log(\sqrt{n}))$。

Code:

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll; const int N = 2e6 + ;
const int Maxn = 1.5e6;
const int M = 2e7 + ; int pCnt = , pri[N], mu[N], tot = , head[N];
ll n;
bool np[N]; struct Node {
int to, nxt;
} e[M]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} inline void sieve() {
mu[] = ;
for (int i = ; i <= Maxn; i++) {
if (!np[i]) pri[++pCnt] = i, mu[i] = -;
for (int j = ; j <= pCnt && i * pri[j] <= Maxn; j++) {
np[i * pri[j]] = ;
if (i % pri[j] == ) {
mu[i * pri[j]] = ;
break;
}
mu[i * pri[j]] = -mu[i];
}
}
} inline ll max(ll x, ll y) {
return x > y ? x : y;
} inline ll min(ll x, ll y) {
return x > y ? y : x;
} inline ll getSum(ll k, int g) {
ll res = ;
for (int i = head[g]; i; i = e[i].nxt)
res += mu[e[i].to] * (k / e[i].to);
return res;
} int main() {
sieve();
scanf("%lld", &n); int lim = sqrt(2LL * n);
for (int i = ; i <= lim; i++)
if (mu[i])
for (int j = ; i * j <= lim; j++)
add(i * j, i); ll ans = 0LL;
for (int i = ; i <= lim; i++) {
ll mx = min(n / i, 1LL * i - ), mn = max(1LL, 1LL * i - (n / i));
ans += getSum(mx, i) - getSum(mn - , i);
} printf("%lld\n", ans);
return ;
}

Luogu 4844 LJJ爱数数的更多相关文章

  1. luogu 4844 LJJ爱数数 (莫比乌斯反演+数学推导)

    题目大意:求满足gcd(a,b,c)==1,1/a+1/b=1/c,a,b,c<=n的{a,b,c}有序三元组个数 因为题目里有LJJ我才做的这道题 出题人官方题解https://www.cnb ...

  2. 「LOJ6482」LJJ爱数数

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

  3. P4844 LJJ爱数数

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

  4. 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 ...

  5. 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} ...

  6. [HZOI 2016]我们爱数数

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

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

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

  8. 【BZOJ】【3530】【SDOI2014】数数

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

  9. BZOJ3530: [Sdoi2014]数数

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

随机推荐

  1. 有状态与无状态 cookie session

    服务器所维护的与客户交互活动的信息称为状态信息.不保存任何状态信息的服务器称为无状态服务器(stateless server),反之则称为有状态服务器(stateful server). 面向连接对应 ...

  2. JavaScript 冒号(:)详解

    1.switch语句分支 2.?:三元表达式的false 3.声明对象直接量的成员 4.声明标签 1和2相信地球人都知道吧?如果有人不知道,那我改成地球上的程序员都知道,哈哈 3.对象直接量我们也经常 ...

  3. PHP MysqlI操作数据库(转)

    1连接数据库. Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter. ...

  4. Delphi AES加密(转)

    (**************************************************************) (* Advanced Encryption Standard (AE ...

  5. HDU 5705 Clock(模拟,分类讨论)

    Clock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submi ...

  6. 1137 Final Grading

    题意:排序题. 思路:通过unordered_map来存储考生姓名与其成绩信息结构体的映射,成绩初始化为-1,在读入数据时更新各个成绩,最后计算最终成绩并把符合条件的学生存入vector,再排序即可. ...

  7. UEditor使用有感(红色),保存内容时,会自动添加p标签

    UEditor 介绍 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 1 入门部署 ...

  8. Redis存储AccessToken

    AccessToken 2小时有效. 就不要每次都调取了,这样会造成浪费. 或者存入Session中,设置过期时间. 或者存入Redis中,设置过期时间. 过期之后,进行重新获取. <?php ...

  9. springboot成神之——application.properties所有可用属性

    application.properties所有可用属性 # =================================================================== # ...

  10. MFC 菜单栏杂记

    1.关于为毛要使用detach()函数 CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach(); //如 ...