题面

传送门:洛咕


Solution

调到自闭,我好菜啊

为了方便讨论,以下式子\(m>=n\)

为了方便书写,以下式子中的除号均为向下取整

我们来颓柿子吧qwq

显然,题目让我们求:

\(\large \sum_{i=1}^n\sum_{j=1}^m lcm(i,j)\)

\(lcm\)没法玩,我们转到\(gcd\)形式:

\(\large \sum_{i=1}^n\sum_{j=1}^m \frac{i*j}{gcd(i,j)}\)

根据套路,我们去枚举\(gcd\)

\(\large \sum_{i=1}^n\sum_{j=1}^m\sum_{d=1}^{n} \frac{i*j}{d}[gcd(i,j)=d]\)

然后可以把\(d\)的和号移到前面去

\(\large \sum_{d=1}^{n}\sum_{i=1}^n\sum_{j=1}^m \frac{i*j}{d}[gcd(i,j)=d]\)

要让\(gcd(i,j)=d\),\(i,j\)都必须要为\(d\)的倍数,我们可以将原来的\(i*d,j*d\)映射为\(i,j\),有:

\(\large \sum_{d=1}^{n}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} {i*j}*d[gcd(i,j)=1]\)

把\(d\)移到前面去

\(\large \sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} {i*j}[gcd(i,j)=1]\)

然后我们可以套路地根据\([x=1]=\sum_{d|x}\mu(d)\)这个柿子把\(gcd(i,j)\)处理掉:

\(\large \sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} {i*j}\sum_{k|gcd(i,j)}\mu(k)\)

根据套路,我们把这种奇奇怪怪的和式变为枚举的形式

\(\large \sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} {i*j}\sum_{k=1}^{n/d}[k|gcd(i,j)]\mu(k)\)

然后就可以把\(k\)往前提了

\(\large \sum_{d=1}^{n}d\sum_{k=1}^{n/d}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d} {i*j}*[k|gcd(i,j)]\mu(k)\)

要有\(k|gcd(i,j)\),\(i,j\)一定要为\(k\)的倍数

\(\large \sum_{d=1}^{n}d\sum_{k=1}^{n/d}\sum_{i=1}^{\frac{n}{d*k}}\sum_{j=1}^{\frac{m}{d*k}} {i*j*k^2}*\mu(k)\)

然后我们简单的移一下项方便处理

\(\large \sum_{d=1}^{n}d\sum_{k=1}^{n/d}*\mu(k)*k^2\sum_{i=1}^{\frac{n}{d*k}}i\sum_{j=1}^{\frac{m}{d*k}} j\)

后面的\(j\)与\(i\)没有半毛钱关系,我们可以把它分离开来

\(\large \sum_{d=1}^{n}d\sum_{k=1}^{n/d}*\mu(k)*k^2(\sum_{i=1}^{\frac{n}{d*k}}i)(\sum_{j=1}^{\frac{m}{d*k}} j)\)

搞定,到这里为止,我们所有东西都可以求了。

对于前面的\(d\)的和式,我们可以发现当\(n/d,m/d\)不变的时候,后面的柿子计算出来的结果是一样的,因此我们可以\(O(\sqrt n)\)来整除分块掉前面那个和式。

后面的那个柿子我们可以再来一次整数除法来计算:最后面的两个和式都是等差数列,前面的\(\mu(k)*k^2\)可以前缀和直接计算。

总复杂度\(O(\sqrt n * \sqrt n)=O(n)\)

但是这题还有一个\(O(\sqrt n)\)的做法,蒟蒻太菜了不会,就不说了


Code

这题细节繁多,请注意多膜以防乘爆

预处理中的\(i^2\)会爆int,请注意

//Luogu  P1829 [国家集训队]Crash的数字表格 / JZPTAB
//Jan,23rd,2019
//莫比乌斯反演
#include<iostream>
#include<cstdio>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=10000000+1000;
const int M=10000000;
const int poi=20101009;
int prime[N],cnt_p,mu[N];
bool noPrime[N];
void GetPrime(int n)
{
noPrime[1]=true,mu[1]=1;
for(int i=2;i<=n;i++)
{
if(noPrime[i]==false)
prime[++cnt_p]=i,mu[i]=-1;
for(int j=1;j<=cnt_p and i*prime[j]<=n;j++)
{
noPrime[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=mu[i]*mu[prime[j]];
}
}
}
long long n,m,pre_mu[N];
long long f(int d)
{
long long t_ans=0;
for(long long l=1,r;l<=n/d;l=r+1)
{
r=min((n/d)/((n/d)/l),(m/d)/((m/d)/l));
t_ans=(t_ans+(pre_mu[r]-pre_mu[l-1])*(((1+n/d/l)*(n/d/l)/2)%poi)%poi*(((1+m/d/l)*(m/d/l)/2)%poi))%poi;
}
return (t_ans%poi+poi)%poi;
}
int main()
{
n=read(),m=read();
if(n>m) swap(n,m); GetPrime(m);
for(long long i=1;i<=m;i++)
pre_mu[i]=((pre_mu[i-1]+mu[i]*i*i)%poi+poi)%poi;
long long ans=0;
for(long long l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans=((ans+(l+r)*(r-l+1)/2%poi*f(l))%poi+poi)%poi;
} printf("%lld",ans);
return 0;
}

[Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

    传送门 式子好麻烦orz……大佬好腻害orz->这里 //minamoto #include<iostream> #include<cstdio> #define ll ...

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

    题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...

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

    P1829 [国家集训队]Crash的数字表格 原题传送门 前置芝士 莫比乌斯反演 乘法逆元 数论分块 正文 //补充:以下式子中的除法均为整除 由题目可以得知,这道题让我们所求的数,用一个式子来表达 ...

随机推荐

  1. LightningChart运行互动示例介绍

    LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点. LightningChart包括广泛的2D,高级3D,Polar,Smith,3D ...

  2. makefile实验五 make clean rebuild 以及规则中的模式替换. 综合小小实验

    makefile代码: .PHONY : rebuild clean $(TARGET) #声明伪目标时,除直接使用目标名外, 也可以使用 $(变量) 这是取变量的值 CC := g++ TARGET ...

  3. C++中的In 和 Out用法

    参考:https://zhidao.baidu.com/question/541219383.html In 这是一个宏,它的实际意义就是告诉你,这个变量或参数是输入值,即你必须给这个变量填写好以后提 ...

  4. matlab中imfilter的用法

    来源:https://blog.csdn.net/qq_15971883/article/details/78334380 转载自:http://blog.csdn.net/u013066730/ar ...

  5. Arduino的外部中断

    Arduino的中断函数格式为attachInterrupt(interrput,function,mode). attachInterrupt函数用于设置外部中断,有3个参数,interrput表示 ...

  6. Linux就该这么学28期——Day02 2.1-2.3

    本文记录必须掌握的Linux命令,部分内容引用自https://www.linuxprobe.com/basic-learning-02.html 工作中可使用https://www.linuxcoo ...

  7. Semaphore最详细解析

    官方解释: 一个计数信号量.在概念上,信号量维持一组许可证.如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它.每个release()添加许可证,潜在地释放阻塞获取方.但是,没 ...

  8. Vue 全宇宙最浪 VSCode 配置、插件

    别人的那一堆配置.插件我就不写了- 首先进入官网下载并安装. 基本配置 在编译器 文件 >> 首选项 >> 设置,可以拷贝相面的选项后搜索相关配置 设置制表符等于空格数为 2: ...

  9. Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?

    本文出自"Python为什么"系列,请查看全部文章 在日常使用 Python 时,我们经常需要创建一个列表,相信大家都很熟练了吧? # 方法一:使用成对的方括号语法 list_a ...

  10. day13 Pyhton学习

    一.昨日内容回顾 生成器 本质就是迭代器 特点: 1.省内存 2.惰性机制 3.只能向前,不能反复 生成器函数 函数中包含yield. yield表示返回和return,分段执行一个函数 def fu ...