「LOJ6482」LJJ爱数数

解题思路 :

打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的):

\[a + b = \text{gcd}(a, b)^2
\]

设 \(g = \text{gcd(a, b)}\) ,那么相当于是要求:

\[\sum_{g=1}^{\sqrt{2n}}\sum_{i}[\text{gcd}(g^2-ig, ig)=g]
\]

化简一波:

\[\sum_{g=1}^{\sqrt{2n}}\sum_{i}[\text{gcd}(g-i, i)=1]
\]

根据辗转相除:

\[\sum_{g=1}^{\sqrt{2n}}\sum_{i}[\text{gcd}(g, i)=1]
\]

考虑 \(i\) 的上界和下界

\[1 \leq ig \leq n \\
1 \leq g^2 -ig \leq n
\]

解一下这两个不等式:

\[\text{max}_i =\min(\lfloor\frac{n}{g}\rfloor,g - 1) \\
\text{min}_i =\max(g-\lfloor\frac{n}{g}\rfloor,1)
\]

原来的式子相当于求:

\[\sum_{g=1}^{\sqrt{2n}}\sum_{i=\text{min}}^{\max}[\text{gcd}(g, i)=1]
\]

设 \(f(n)\) 表示 \([1, n]\) 之间与 \(g\) 互质的数的个数,反演一波可以得到:

\[f(n)= \sum_{d|g} \lfloor \frac{n}{d}\rfloor \mu(d)
\]

再化简一波式子:

\[\sum_{g=1}^{\sqrt{2n}}f(\max) -f(\min-1)
\]

总复杂度 \(O(\sqrt{n}logn)\) 。

code

/*program by mangoyang*/
#pragma GCC optimize("Ofast", "inline")
#include<bits/stdc++.h>
#define inf ((int)(1e9))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 1500005;
int prime[N], d[30000005], tmp[N], mu[N], len[N], b[N], tot;
ll n, ans, m;
inline int solve(int x, int n){
int ans = 0;
for(register int i = len[x-1] + 1; i <= len[x]; i++) ans += mu[d[i]] * (n / d[i]);
return ans;
}
int main(){
read(n), mu[1] = 1;
for(int i = 2; i < N; i++){
if(!b[i]) prime[++tot] = i, mu[i] = -1;
for(int j = 1; j <= tot && i * prime[j] < N; j++){
b[i*prime[j]] = 1;
if(i % prime[j] == 0){ mu[i*prime[j]] = 0; break; }
mu[i*prime[j]] = -mu[i];
}
}
m = (int) sqrt(2ll * n);
for(int i = 1; i <= m; i++) if(mu[i])
for(int j = i; j <= m; j += i) len[j]++;
for(int i = 1; i <= m; i++) len[i] += len[i-1];
for(int i = 1; i <= m; i++) if(mu[i])
for(int j = i; j <= m; j += i) d[(++tmp[j])+len[j-1]] = i;
for(int g = 1; g <= m; g++)
ans += solve(g, Min(n / g, g - 1)) - solve(g, Max(1, g - n / g) - 1);
cout << ans << endl;
return 0;
}

「LOJ6482」LJJ爱数数的更多相关文章

  1. 【LOJ6482】LJJ 爱数数 数论

    题目大意 给你 \(n\),求 \[ \sum_{a=1}^n\sum_{b=1}^n\sum_{c=1}^n[\frac{1}{a}+\frac{1}{b}=\frac{1}{c}][\gcd(a, ...

  2. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  3. 「SDOI2014」数数 解题报告

    「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...

  4. P4844 LJJ爱数数

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

  5. LibreOJ2095 - 「CQOI2015」选数

    Portal Description 给出\(n,k,L,R(\leq10^9)\),求从\([L,R]\)中选出\(n\)个可相同有顺序的数使得其gcd为\(k\)的方案数. Solution 记\ ...

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

  7. 「CQOI2015」选数

    「CQOI2015」选数 题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都 ...

  8. 【LOJ】#3094. 「BJOI2019」删数

    LOJ#3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了... em,就是\([1,n]\)之间每个数\(i\),然后\([i - cnt[i] + 1,i]\)可以 ...

  9. 【LOJ】#2983. 「WC2019」数树

    LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i ...

随机推荐

  1. 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP

    [题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...

  2. 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS

    [题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...

  3. jq消除网页滚动条

    网页有些时候需要能滚动的效果,但是不想要滚动条,我就遇到了这样的需求.自己用jq写了一个垂直滚动条. 纯css也可以实现 .box::-webkit-scrollbar{display:none} 但 ...

  4. virtualenv搭建虚拟环境

    最近因为项目需要,要在CentOS 7 上搭建一套开发环境,虽说Python的背后有着庞大的开源社区支持,但是有一个缺点就是每个包的质量都参差不齐,如果我们在工作服务器上去测试安装每个包,就会造成整个 ...

  5. stegsolve使用探究

    应该也不是工具的问题吧,更多的是图片.但是不知道咋取就写工具了. 比如:http://ctf5.shiyanbar.com/stega/chromatophoria/steg.png 我在想为毛要选择 ...

  6. go语言基本介绍

    Golang发展历史 1. 诞生历史a. 诞生与2006年1月2号下午15点4分5秒b. 2009发布并正式开源c. 2012年第一个正式版本Go 1.0发布d. 截至到2017年8月24号Go 1. ...

  7. linux 进程优先级 之设置实时进程 (另一种方式是设置nice值)【转】

    转自:https://www.cnblogs.com/jkred369/p/6731353.html Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIF ...

  8. linux的curl用法【转】

    每分钟访问云签到任务执行页面.顺便记录了下curl的用法.以下内容摘自阮一峰博客. 一.查看网页源码 直接在curl命令后加上网址,就可以看到网页源码.我们以网址www.sina.com为例(选择该网 ...

  9. sicily 1193. Up the Stairs

    Time Limit: 1sec    Memory Limit:32MB  Description John is moving to the penthouse of a tall sky-scr ...

  10. python3.6升级及setuptools、pip安装

    升级python3.6 1.打开官网www.python.org,找到最新3.6.3版本,复制下载链接 2.创建/app目录,wget下载到该目录下,编译安装 mkdir /app cd /app w ...