Description

给你$n$,$m$,求 $\sum^n_{i=1} \sum^m_{j=1} \ lcm(x,y)$

答案对$100000009$取模。

多组数据。

Input

第一行有一个正整数$t$表示数据组数

接下来$t$行每行有两个正整数$n$,$m$

Output

$t$行,第$i$行为第$i$组询问的答案。

HINT

对于$100\%$的数据:$t\leq 10000,n,m\leq {10}^7$

$100000009$不是一个质数。

题解:

第一次打莫演,手推公式。(我为什么会做这道题)

\begin{aligned}
ans&=\sum^n_{i=1}\sum^m_{j=1}\frac{ij}{gcd(i,j)}\\
&=\sum^n_d\sum^n_{i=1}\sum^m_{j=1}\frac{ij}{d}[gcd(i,j)=d]\\
&=\sum^n_d\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}\frac{d^2ij}{d}[gcd(i,j)=1]\\
&=\sum^n_d\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}dij\sum_{k\mid gcd(i,j)}\mu(k)&(\sum_{d\mid n}\mu(d)=[n=1])\\
&=\sum^n_k\mu(k)\sum^n_d\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}[k\mid i]\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}[k\mid j]dij\\
&=\sum^n_k\mu(k)\sum^n_d\sum^{\lfloor\frac{n}{kd}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{kd}\rfloor}_{j=1}dk^2ij\\
&=\sum^n_k\mu(k)\sum^n_d\sum^{\lfloor\frac{n}{kd}\rfloor}_{i=1}i\sum^{\lfloor\frac{m}{kd}\rfloor}_{j=1}j\cdot dk^2\\
&设 T=kd\\
ans&=\sum^n_{T=1}\sum^{\lfloor\frac{n}{T}\rfloor}_{i=1}i\sum^{\lfloor\frac{m}{T}\rfloor}_{j=1}j\sum_{d\mid T}\mu(\frac{T}{d})\frac{T^2}{d}
\end{aligned}

第一个部分 $ \sum^{\lfloor\frac{n}{T}\rfloor}_{i=1}i\sum^{\lfloor\frac{m}{T}\rfloor}_{j=1}j $ 用等差数列求和 $O(1)$ 求出

第二个部分 $ \sum_{d\mid T}\mu(\frac{T}{d})\frac{T^2}{d} $ 线性筛 $O(n)$ 预处理处

设$ g(x)=\sum_{d\mid T}\mu(\frac{T}{d})\frac{T^2}{d} $,考虑怎么求$g(x)$

如果说x为质数,那么根据公式$g(x)=x-x^2$

如果$x$不为质数,我们设$x=i\times p$,其中$p$为质数,那么有两种情况

$p\nmid i$,由于$i$和$p$互质而$g(x)$为积性函数,$g(x)=g(i\times p)=g(i)\times g(p)$

$p\mid i$,这个时候就有点不是很好搞了……

我们可以把i表示为$t\times p^k$($t$与$p$互质)

那么我们就尝试一下从乘了一个$p$会有什么影响这个方面来考虑一下

考虑$g(p^k)$的值,显然根据$\mu$的定义,只有$\mu(1)$和$\mu(p)$能够提供贡献(其他的$p$的指数都$>1$,所以都是$0$)

那么我们就可以得到$g(p^k)=f(1)p^k+f(p)p^{k-1}$

然后写出$g(p^{k+1})$的表达式,会发现是$f(1)p^{k+1}+f(p)p^k$

也就是说$g(p^{k+1})=g(p^k)p$

那么就可以得到$g(x)=g(i^p)=g(t\times p^k\times p)=g(t)\times g(p^k)\times p=g(x)\times p$

然后就可以顺利筛出来啦

最外层循环用数论分块,总时间 $O(\sqrt{n})$

CODE:

 #include<iostream>
#include<cstdio>
using namespace std; #define mod 100000009LL
#define N 10000005
int t,n,m,cnt,ans;
long long pri[N],g[N],sum[N];
bool vis[N]; void init(){
sum[]=g[]=;
for(int i=;i<N;i++){
sum[i]=1LL*i*(i+)/%mod;
if(!vis[i]){
g[i]=(i-1LL*i*i%mod+mod)%mod;
pri[++cnt]=i;
}
for(int j=;j<=cnt&&i*pri[j]<N;j++){
vis[i*pri[j]]=true;
if(i%pri[j])
g[i*pri[j]]=g[i]*g[pri[j]]%mod;
else
g[i*pri[j]]=g[i]*pri[j]%mod;
}
}
for(int i=;i<N;i++)(g[i]+=g[i-])%=mod;
} int main(){
scanf("%d",&t);
init();
while(t--){
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
ans=;
for(int i=,pos=;i<=n;i=pos+){
pos=min(n/(n/i),m/(m/i));
ans+=sum[n/i]*sum[m/i]%mod*(g[pos]-g[i-]+mod)%mod;
ans%=mod;
}
printf("%d\n",ans);
}
}

【BZOJ2693】jzptab (莫比乌斯反演)的更多相关文章

  1. BZOJ2693: jzptab(莫比乌斯反演)

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2068  Solved: 834[Submit][Status][Discuss] Descripti ...

  2. bzoj2693 jzptab 莫比乌斯反演|题解

    Description   Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 ...

  3. 【BZOJ2693】jzptab [莫比乌斯反演]

    jzptab Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description   求 Input 第一行一个 ...

  4. 【bzoj2693】jzptab 莫比乌斯反演+线性筛

    题目描述 输入 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M 输出 T行 每行一个整数 表示第i组数据的结果 样例输入 1 4 5 样例输出 122 题解 莫比乌斯反演+线性筛 由 ...

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

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

  6. 【BZOJ】2693: jzptab 莫比乌斯反演

    [题意]2154: Crash的数字表格 莫比乌斯反演,多组询问,T<=10000. [算法]数论(莫比乌斯反演) [题解]由上一题, $ans=\sum_{g\leq min(n,m)}g\s ...

  7. BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discu ...

  8. BZOJ 2693: jzptab( 莫比乌斯反演 )

    速度居然#2...目测是因为我没用long long.. 求∑ lcm(i, j) (1 <= i <= n, 1 <= j <= m) 化简之后就只须求f(x) = x∑u( ...

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

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

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

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

随机推荐

  1. MySql数据库中where的使用

    SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程'; MySQL 的 WHERE 子句的字符串比较是不区分大小写的. 你可以使用 BINARY 关键 ...

  2. /^/m|/$/m|\b|\B|$&|$`|$'|变量捕获|()?|(?:pattern)|(?<LABEL>PATTERN)|$+{LABEL}|(|)|\g{LABEL}

    #!/usr/bin/perl use strict; use warnings; $_=' $$ oinn &&& ninq kdownc aninp kkkk'; if ( ...

  3. javaweb基础(24)_jsp一般的标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  4. ubuntu 16.04 + 中文输入法

    在桌面右上角设置图标中找到"System Setting",双击打开. 在打开的窗口里找到"Language Support",双击打开. 可能打开会说没有安装 ...

  5. NOIP复习之1 数学数论

    noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...

  6. 【线性基】bzoj2844: albus就是要第一个出场

    线性基求可重rank 题目描述 给定 n 个数 $\{ a_i \}$ ,以及数 $x$. 将 $\{ a_i \}$​ 的所有子集(包括空集)的异或值从小到大排序,得到 $\{ b_i \} $. ...

  7. Docker 守护进程的配置和操作 & 远程访问

    守护进程的配置和操作 1.查看守护进程 linux命令: ps -ef | gerp docker sudo status docker 2.开启关闭重启守护进程 sudo service docke ...

  8. Linux基础学习-crond系统计划任务

    系统计划任务 大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本,从而实现运维的自动化,这就要借助Linux的cron功能了. 计划任务分为一次性计划任务和周期性计划任务 ...

  9. Hogan的安装和使用

    Hogan的安装和使用 通过npm安装hogan: npm install hogan.js --save-dev CommonJs下的使用方式: // 引入hogan var hogan = req ...

  10. Python基础——类

    创建类 class people: '帮助信息:dsafdaf' #所有实例都会共享的 number=100 #构造函数,初始化的方法,当创建一个类的时候,首先会调用它 def __init__(se ...