「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. Lua的各种资源2

    Lua Directory     This page is a top level directory of all Lua content at this wiki, grouped by top ...

  2. Gmail登录(2017.10)

    本文地址:http://www.cnblogs.com/veinyin/p/7646382.html  由于众所周知的原因,我们使用 Gmail 查看邮件时会有些麻烦,有时梯子不够用甚至不能查看. 比 ...

  3. 去除UITableView多余的seperator

    UIView *v = [[UIView alloc] initWithFrame:CGRectZero]; [tableView setTableFooterView:v]; [v release] ...

  4. 使sqoop能够启用压缩的一些配置

    在使用sqoop 将数据库表中数据导入至hdfs时 配置启用压缩 hadoop 的命令    检查本地库支持哪些  bin/hadoop checknative 需要配置native    要编译版本 ...

  5. hdu 5326 Work(杭电多校赛第三场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Time Limit: 2000/1000 MS (Java/Others)    M ...

  6. thinkphp博客项目纪录

    项目地址:http://files.cnblogs.com/files/wordblog/blog.zip

  7. Skipping 'Android SDK Tools, revision 24.0.2'; it depends on 'Android SDK Platform-tools, revision 20' which was not installed.

    前几天,同事问我eclipse android sdk怎么不能更新. 更新界面是显示(mirrors.neusoft.edu.cn:80),但是不能更新. 问题描述如下: URL not found: ...

  8. EasyUi组合条件分页查询

    1.引入css与js文件 <link rel="stylesheet" type="text/css" href="themes/default ...

  9. Perl6多线程3: Promise start / in / await

    创建一个Promise 并自动运行: my $p = Promise.start({say 'Hello, Promise!'}); 如果把代码改成如下, 我们会发现什么也没打印: ;say 'Hel ...

  10. linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的 ...