传送门:洛谷bzoj

题目描述

今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple)。对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整数。例如,LCM(6, 8) = 24。
回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张NM的表格。每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j)。一个45的表格如下:

1    2    3    4    5
2    2    6    4    10
3    6    3    12    15
4    4    12    4    20

看着这个表格,Crash想到了很多可以思考的问题。不过他最想解决的问题却是一个十分简单的问题:这个表格中所有数的和是多少。当N和M很大时,Crash就束手无策了,因此他找到了聪明的你用程序帮他解决这个问题。由于最终结果可能会很大,Crash只想知道表格里所有数的和mod20101009的值。

题解

蒟蒻chh来推导一下:
答案要求:
\[\sum^{n}_{i=1}\sum^{m}_{j=1}lcm(i,j)\]
根据小学知识,最小公倍数\(\times\)最大公约数=两个数的乘积。
那么答案就变成了:
\[\sum^{n}_{i=1}\sum^{m}_{j=1}\frac{i\times j}{gcd(i,j)}\]
整除分块枚举最大公约数\(d\),商互质
\[\sum^{n}{i=1} \sum{m}{j=1} \sum_{d|i,d|j,gcd(\frac{i}{d},\frac{j}{d})=1} \frac{i\times j}{d}\]
将这个gcd算式转换:
\[\sum^{n}_{d=1} \times \sum^{\lfloor\frac{n}{d}\rfloor}_{i=1} \sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}[gcd(i,j)=1] \times i \times j\]
在将原来的式子进行简化
\[calc(n,m) = \sum^{n}_{i=1} \sum^{m}_{j=1}[gcd(i,j) = 1] \times i \times j\]
那么我们如果我们能算出\(calc\),那么就可以用数论分块求解。
枚举约数
\[\sum^{n}_{d=1} \sum^{n}_{d|i} \sum^{m}_{d|j} \mu (d) \times i \times j\]
设\(i=i' \times d, j = j' \times d\),代入原式:
\[\sum^{n}_{d=1} \mu(d) \times d ^ 2 \times \sum^{\lfloor \frac{n}{d}\rfloor}_{i=1} \sum^{\lfloor \frac{m}{d}\rfloor}_{j=1} \times i \times j\]
莫比乌斯函数前缀和预处理前一部分答案,后一部分答案我们假设\(calc2(n,m)\)。
那么以上答案又可以用一个数论分块求解。
\[calc2(n,m)=\sum^{n}_{i=1} \sum^{m}_{j=1} \times i \times j = \frac{n \times (n + 1)}{2} \times \frac{m\times (m+1)}{2}\]
以上可以\(O(1)\)计算。
那么我们把我们所有简化的式子代回去就可以了。
附赠大佬证明:

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define mod 20101009
#define N 10000005
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
int n, m, prime_tot;
bool vis[N];
int prime[N], mu[N], sum[N];
void get_mu(int MAXN) {
    mu[1] = 1;
    prime_tot = 0;
    for (int i = 2; i <= MAXN; i ++) {
        if (!vis[i]) {
            prime[++ prime_tot] = i;
            mu[i] = -1;
        }
        for (int j = 1; j <= prime_tot && prime[j] * i <= MAXN; j ++) {
            vis[prime[j] * i] = 1;
            if (i % prime[j] == 0) break;
            else mu[prime[j] * i] = -mu[i];
        }
    }
    for (int i = 1; i <= MAXN; i ++) {
        sum[i] = (sum[i - 1] + 1ll * i * i % mod * (mu[i] + mod)) % mod;
    }
}
int calc2(int x, int y) {
    return (1ll * x * (x + 1) / 2 % mod) * (1ll * y * (y + 1) / 2 % mod) % mod;
}
int calc(int x, int y) {
    int res = 0;
    for (int l = 1, r; l <= min(x, y); l = r + 1) {
        r = min(x / (x / l), y / (y / l));
        res = (res + 1ll * (sum[r] - sum[l - 1] + mod) * calc2(x / l, y / l) % mod) % mod;
    }
    return res;
}
int main() {
    read(n); read(m);
    get_mu(min(n, m) + 1);
    int ans = 0;
    for (int l = 1, r; l <= min(n, m); l = r + 1) {
        r = min(n / (n / l), m / (m / l));
        ans = (ans + 1ll * (r - l + 1) * (r + l) / 2 % mod * calc(n / l, m / l) % mod) % mod;
    }
    printf("%d\n", ans);
    return 0;
}

[luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】的更多相关文章

  1. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  2. 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...

  3. [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演

    ---题面--- 题解: $$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{\frac{ij}{gcd(i, j)}}$$ 改成枚举d(设n < m) $$ans ...

  4. P1829 [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演

    又一道...分数和取模次数成正比$qwq$ 求:$\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)$ 原式 $=\sum_{i=1}^N\sum_{j=1}^M\frac{i*j}{g ...

  5. luoguP1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    题意 注:默认\(n\leqslant m\). 所求即为:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 因为\(i*j=\gcd(i, ...

  6. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  7. 题解-[国家集训队]Crash的数字表格 / JZPTAB

    题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...

  8. 【题解】[国家集训队]Crash的数字表格 / JZPTAB

    求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{ ...

  9. P1829 [国家集训队]Crash的数字表格 / JZPTAB

    推式子太快乐啦!虽然我好蠢而且dummy和maomao好巨(划掉) 思路 莫比乌斯反演的题目 首先这题有\(O(\sqrt n)\)的做法但是我没写咕咕咕 然后就是爆推一波式子 \[ \sum_{i= ...

随机推荐

  1. jetty 客服端 与服务端

    jetty 服务端,客服端有请求buffter 检查 默认4kb 4096 客服端 HttpClient client=new HttpClient(); client.setRequestBuffe ...

  2. BJOI2019 题解

    BJOI2019 题解 在更了在更了 P5319 [BJOI2019]奥术神杖 对\(V_i\)求个\(\ln\)变成了让平均数最大,显然套分数规划,然后ac自动机上面dp #include<b ...

  3. 【JVM.5】类文件结构

    鲁迅曾经说过:代码编译的结构从本地机器码转变为字节码,是存储格式发展的一小步,确是编程语言发展的一大步. 一.无关性的基石 Java设计者在最初就承诺过“In the future, we will ...

  4. Linux下rsyslog日志收集服务环境部署记录

    rsyslog 可以理解为多线程增强版的syslog. 在syslog的基础上扩展了很多其他功能,如数据库支持(MySQL.PostgreSQL.Oracle等).日志内容筛选.定义日志格式模板等.目 ...

  5. CentOS 6.7下 Samba服务器的搭建与配置(share共享模式)

    https://www.linuxidc.com/Linux/2016-12/138220.htm

  6. SE Springer小组之《Spring音乐播放器》可行性研究报告一、二(转载)

         此文转载自组员小明处~~ 1 引言 1.1编写目的 <软件工程>课程,我们团队计划开发一个音乐播放器.本文档是基于网络上现有的音乐播放器的特点,团队计划实现的音乐播放器功能和团队 ...

  7. 第三个Sprint ------第七天

    APP.java代码 package com.app.senior_calculator; import java.io.Serializable; import java.util.ArrayLis ...

  8. BETA 版冲刺前准备

    任务博客 组长博客 总的来讲Alpha阶段我们计划中的工作是如期完成的.不过由于这样那样的原因,前后端各个任务完成度不算非常高,距离完成一个真正好用.完美的软件还有所差距. 过去存在的问题 测试工作未 ...

  9. R和python语言如何求平均值,中位数和众数

    均值是通过取数值的总和并除以数据序列中的值的数量来计算. R语言平均值公式: mean(x, trim = 0, na.rm = FALSE, ...)#x - 是输入向量.trim - 用于从排序的 ...

  10. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...