博客
关于我
Luogu P4844 LJJ爱数数
阅读量:325 次
发布时间:2019-03-01

本文共 1883 字,大约阅读时间需要 6 分钟。

gcd(A, g - A) = 1,且满足以下不等式:

  • (g - A) * A ≤ n
  • A * g ≤ n
  • (g - A) * g ≤ n

为了求解满足条件的数对 (A, g) 的个数,可以使用包含-排除原理和 Möbius 反演函数。首先,我们需要预处理每个数的约数,并使用邻接表存储,避免使用向量以防止超时。

代码解释

#include 
#include
#include
#include
#include
#include
#include
using namespace std;template
T read() { T x = 0; int f = 1; char ch = getchar(); while ((ch < '0') || (ch > '9')) { if (ch == '-') { f = -f; } ch = getchar(); } while ((ch >= '0') && (ch <= '9')) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f;}const int maxn = 1414213;const int maxm = 13288457;int p[maxn + 10], prime[maxn + 10], cnt, mu[maxn + 10], pre[maxm + 10], now[maxn + 10], son[maxm + 10], tot;int add(int a, int b) { pre[++tot] = now[a]; now[a] = tot; son[tot] = b; return 0;}int get_prime() { p[1] = mu[1] = 1; for (int i = 2; i <= maxn; ++i) { if (!p[i]) { prime[++cnt] = i; mu[i] = -1; } for (int j = 1; (j <= cnt) && (i * prime[j] <= maxn); ++j) { int x = i * prime[j]; p[x] = 1; if (i % prime[j] == 0) { mu[x] = 0; break; } mu[x] = -mu[i]; } } for (int i = 1; i <= maxn; ++i) { if (!mu[i]) { continue; } for (int j = 1; j <= maxn / i; ++j) { add(i * j, i); } } return 0;}inline long long solve(int x, int l, int r) { long long ans = 0; for (int i = now[x]; i; i = pre[i]) { int k = son[i]; ans += mu[k] * (r / k - l / k); } return ans;}long long n;int main() { get_prime(); n = read
(); long long ans = 0; int mx = sqrt(2 * n) + 1; for (int i = 2; i <= mx; ++i) { int lower = max(1, i - n / i); int upper = min(n / i, i - 1); if (lower > upper) { continue; } ans += solve(i, lower, upper); } printf("%lld\n", ans); return 0;}

代码解释

  • 读取输入:使用 read 函数读取输入数据,处理正负号。
  • 预处理质数和 Möbius 函数:使用 Sieve of Eratosthenes 预处理质数,并计算 Möbius 函数。
  • 添加约数关系:使用邻接表存储每个数的约数关系。
  • 求解函数:使用包含-排除原理通过 Möbius 反演函数计算满足条件的数对个数。
  • 输出结果:计算并打印满足条件的数对个数。
  • 该代码通过预处理和高效的数论方法,确保在合理时间内处理大数范围,避免超时。

    转载地址:http://djwo.baihongyu.com/

    你可能感兴趣的文章
    PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
    查看>>
    PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
    查看>>
    PostgreSQL学习笔记:PostgreSQL vs MySQL
    查看>>
    PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
    查看>>
    PostgreSQL导入shape数据(地图工具篇.10)
    查看>>
    PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
    查看>>
    PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
    查看>>
    Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
    查看>>
    PostgreSQL忘记密码
    查看>>
    PostgreSQL数据库pg_dump命令行不输入密码的方法
    查看>>
    PostgreSQL新手入门
    查看>>
    postgresql树状结构查询示例
    查看>>
    PostgreSQL流复制参数max_wal_senders详解
    查看>>
    postgresql流复制配置
    查看>>
    PostgreSQL清空表并保留表结构、清空数据库还原数据库为新建时的状态的方法
    查看>>
    PostgreSQL的 initdb 源代码分析之九
    查看>>
    PostgreSQL的安装与使用指南
    查看>>
    postman之参数化详解
    查看>>
    Postman入门到入土
    查看>>
    Postman如何做接口测试:如何导入 swagger 接口文档
    查看>>