Description

在整理以前的试题时,他发现了这样一道题目:“求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和。”

现在他长大了,题目也变难了,所以麻烦你来帮他解决一道数论题吧。

他需要你求如下表达式的值:

\[\sum_{i=1}^N\sum_{j=1}^N\max(i,j)⋅σ(i⋅j)
\]

其中 \(\max(i,j)\) 表示 \(i\) 和 \(j\) 里的最大值,\(\sigma(i⋅j)\) 表示 \(i⋅j\) 的约数之和。

例如当 \(N=2\) 的时候,由 \(σ(1)=1,σ(2)=1+2=3,σ(4)=1+2+4=7\) 可知,答案应为 \(1⋅σ(1⋅1)+2⋅σ(1⋅2)+2⋅σ(2⋅1)+2⋅σ(2⋅2)=27\)。

他发现答案有点大,所以你只需要告诉他答案模 \(1000000007\) 的值即可。

Input

每个测试点含有多组测试数据。

第一行是一个正整数 \(T\),表示接下来有 \(T\) 组测试数据。

接下来的 \(T\) 行,每组测试数据占一行。

每行有一个正整数 \(N\),含义如描述所示。

Output

共有 \(T\) 行。对于每组测试数据,输出一行信息"Case #x: y"。

其中 \(x\) 表示对应的是第几组测试数据,\(y\) 表示相应的答案模 \(1000000007\) 的值。

Sample Input

5
1
2
3
4
5

Sample Output

Case #1: 1
Case #2: 27
Case #3: 162
Case #4: 686
Case #5: 1741

HINT

\(1≤T≤50000,1≤N≤1000000\)

Solution

〖一〗

\[\sigma(i\cdot j)=\sum\limits_{p\mid i}\sum\limits_{q\mid j}[\left(p,q)=1\right]\dfrac{p\cdot j}{q}
\]

证明:原式 \(=\sum\limits_{p\mid i}\sum\limits_{q\mid j}\left[\left(p,\dfrac{j}{q}\right)=1\right]p\cdot q\),设 \(i=\sum p_i^{a_i},j=\sum p_i^{b_i},p=\sum p_i^{c_i},q=\sum p_i^{d_i}\)。

  • 若 \(0<c_i\le a_i\),则 \(d_i=b_i\),此时可以表示出 \(p_i^{(b_i+1)\rightarrow(b_i+a_i)}\);
  • 若 \(c_i=0\),则 \(0\le d_i\le b_i\),此时可以表示出 \(p_i^{0\rightarrow b_i}\)。

综上,该式一定可以表示出 \(p_i^{0\rightarrow(b_i+a_i)}\)。

〖二〗

\[\sum_{i=1}^n\sum_{j=1}^n\max(i,j)⋅σ(i⋅j)=2\sum_{i=1}^{n}\sum_{j=1}^{i}i\cdot\sigma(i\cdot j)-\sum_{i=1}^ni\cdot\sigma(i^2)
\]

\[\begin{eqnarray}
\sum_{i=1}^ni\cdot\sigma(i^2)&=&\sum_{i=1}^{n}i\sum_{p\mid i}\sum_{q\mid i}[(p,q)=1]\frac{p\cdot i}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{n}i\sum_{p\mid i}\sum_{q\mid i}[d\mid(p,q)]\frac{p\cdot i}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{n}i\sum_{d\mid p\mid i}\sum_{d\mid q\mid i}\frac{p\cdot i}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\cdot d^2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}i\sum_{p\mid i}p\sum_{q\mid i}\frac{i}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\cdot d^2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}i\left(\sum_{p\mid i}p\right)^2
\end{eqnarray}
\]

\[\begin{eqnarray}
\sum_{i=1}^{n}\sum_{j=1}^{i}i\cdot \sigma(i\cdot j)&=&\sum_{i=1}^{n}\sum_{j=1}^{i}i\sum_{p\mid i}\sum_{q\mid j}[(p,q)=1]\frac{p\cdot j}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{n}\sum_{j=1}^{i}i\sum_{p\mid i}\sum_{q\mid j}[d\mid(p,q)]\frac{p\cdot j}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\cdot d^2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}i\sum_{p\mid i}p\sum_{j=1}^{i}\sum_{q\mid j}\frac{j}{q}\\
&=&\sum_{d=1}^{n}\mu(d)\cdot d^2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}i\sum_{p\mid i}p\sum_{j=1}^{i}\sum_{q\mid j}q
\end{eqnarray}
\]

而这样只能做到 \(O(\sqrt n)\) 询问,于是进一步化简:

\[\begin{eqnarray}
\sum_{d=1}^{n}\mu(d)\cdot d^2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}f(i)&=&\sum_{i=1}^n\sum_{d\mid i}\mu(d)\cdot d^2\cdot f\left(\frac{i}{d}\right)
\end{eqnarray}
\]

第一个式子中的 \(d\) 是 \(i\cdot d\) 的约数,第二个式子中的 \(i\) 表示 \(i\cdot d\),\(d\) 还是约数,因此两个式子相等。

然后就可以 \(O(n\ln n)\) 预处理,\(O(1)\) 查询了。

Code

#include <cstdio>

const int N = 1000005, mod = 1000000007;
int mu[N], np[N], p[N], tot, a[N], b[N], f[N], g[N], n = 1000000; int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void euler() {
mu[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!np[i]) p[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
np[i * p[j]] = 1;
if (i % p[j] == 0) { mu[i * p[j]] = 0; break; }
mu[i * p[j]] = -mu[i];
}
}
}
int main() {
euler();
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; j += i)
if ((a[j] += i) >= mod) a[j] -= mod;
for (int i = 1; i <= n; ++i) if ((b[i] = b[i - 1] + a[i]) >= mod) b[i] -= mod;
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; j += i) {
f[j] = (f[j] + 1LL * mu[i] * i * j % mod * a[j / i] % mod * b[j / i]) % mod;
g[j] = (g[j] + 1LL * mu[i] * i * j % mod * a[j / i] % mod * a[j / i]) % mod;
}
for (int i = 2; i <= n; ++i) {
if ((f[i] += f[i - 1]) >= mod) f[i] -= mod;
if (f[i] < 0) f[i] += mod; //mu可能是负数, 需要判断正负
if ((g[i] += g[i - 1]) >= mod) g[i] -= mod;
if (g[i] < 0) g[i] += mod;
}
int T = read();
for (int i = 1; i <= T; ++i) n = read(), printf("Case #%d: %lld\n", i, (2LL * f[n] + mod - g[n]) % mod);
return 0;
}

[51Nod 1584] 加权约数和的更多相关文章

  1. 51NOD 1584 加权约数和 [莫比乌斯反演 转化 Trick]

    1584 加权约数和 题意:求\(\sum_{i=1}^{N} \sum_{j=1}^{N} {\max(i,j)\cdot \sigma(i\cdot j)}\) 多组数据\(n \le 10^6, ...

  2. 51nod 1584 加权约数和 约数和函数小trick 莫比乌斯反演

    LINK:加权约数和 我曾经一度认为莫比乌斯反演都是板子题. 做过这道题我认输了 不是什么东西都是板子. 一个trick 设\(s(x)\)为x的约数和函数. 有 \(s(i\cdot j)=\sum ...

  3. 51nod 1584加权约数和

    学到了好多东西啊这题... https://blog.csdn.net/sdfzyhx/article/details/72968468 #include<bits/stdc++.h> u ...

  4. [51 Nod 1584] 加权约数和

    题意 求∑i=1N∑j=1Nmax(i,j)⋅σ1(ij)\large \sum_{i=1}^N\sum_{j=1}^Nmax(i,j)\cdot\sigma_1(ij)i=1∑N​j=1∑N​max ...

  5. 【51Nod1584】加权约数和(数论)

    [51Nod1584]加权约数和(数论) 题面 51Nod 题解 要求的是\[\sum_{i=1}^n\sum_{j=1}^n max(i,j)\sigma(ij)\] 这个\(max\)太讨厌了,直 ...

  6. Solution -「51nod 1584」加权约数和

    \(\mathcal{Description}\)   Link.   令 \(\sigma(n)\) 为 \(n\) 的约数之和.求: \[\sum_{i=1}^n\sum_{j=1}^n\max\ ...

  7. 51Nod1584 加权约数和

    这题其实就是反演一波就好了(那你还推了一下午+一晚上),不过第一次碰到\(O(n\log n)\)预处理分块和式的方法-- 不知为啥我跟唐教主的题解推的式子不太一样--(虽然本质上可能是相同的吧) 那 ...

  8. 51nod1584加权约数和

    题目大意: 求: \[ \sum_{i-1}^n\sum_{j=1}^nmax(i,j)\sigma(i*j) \] 题解 对于这个\(\max\),套路的把它转化成: \[ 2*\sum_{i=1} ...

  9. Note -「Mobius 反演」光速入门

    目录 Preface 数论函数 积性函数 Dirichlet 卷积 Dirichlet 卷积中的特殊函数 Mobius 函数 & Mobius 反演 Mobius 函数 Mobius 反演 基 ...

随机推荐

  1. JS 格式化时间(获取两个日期之间的每一天、每一月、每半小时、每一秒)

    时间戳转换为时间 // 时间戳转换为时间 function timestampToTime(timestamp, isMs = true) { const date = new Date(timest ...

  2. mysqlfrm

    mysqlfrm可基于frm文件生成对应的表结构.常用于数据恢复场景. 其有两种操作模式. 1. 创建一个临时实例来解析frm文件. 2. 使用诊断模式解析frm文件. 以下表进行测试,看看, 1.  ...

  3. Java 将两个Map对象合并为一个Map对象

    实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...

  4. Django Rest framework基础使用之View:APIView, mixins, generic, viewsets

    先看一张图,对DRF的各个APIView,Mixin,Viewset等有个基本印象: 具体使用方法: 1.APIView: DRF 的API视图 有两种实现方式: 一种是基于函数的:@api_view ...

  5. Mysql多实例之mysql服务脚本

    1. #init port=3306 mysql_user="root" mysql_pwd="cancer" CmdPath="/applicati ...

  6. CRM系统设计方案

    CRM系统设计方案 - 百度文库https://wenku.baidu.com/view/a34eebeb0242a8956bece473.html 服务支持http://www.uf-crm.com ...

  7. nodejs配置nginx 以后链接mongodb数据库

    服务器 :windows server2008 R2 反向代理 :nginx 1.15.1 for window 64位 数据库:mongodb 4 64位 使用框架express 首先下载nodej ...

  8. yolo buffer is too small for requested array

    yolo.cfg 与 yolo.weights 版本一定要对应, darknet链接 https://github.com/pjreddie/darknet 下载后在cfg文件夹下找到yolov2的配 ...

  9. 12 Connections

    1 and 出现在两个及以上的词,词组,或者句子之间,将它们连接起来.在正式的书面英语中,and不能出现在句首.在非正式的英语中可以. We should expand our product lin ...

  10. 【学亮IT手记】利用字节流复制图片