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. Centos7之Systemd(Service文件)详解

    一.开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件. 如果你想让该软件开机启动,就执行下面的命令(以httpd. ...

  2. koa2实现session的两种方式(基于Redis 和MySQL)

    一.基于MySQL的实现方式 这种方式需要安装koa-session-minimal和koa-mysql-session两个依赖. 执行 npm install koa-session-minimal ...

  3. POJ - 2528 区间离散化,线段树区间修改,区间询问

    这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新 ...

  4. Median String CodeForces - 1144E

    You are given two strings ss and tt, both consisting of exactly kk lowercase Latin letters, ss is le ...

  5. case when then的用法-leetcode交换工资

    case具有两种格式:简单case函数和case搜索函数. --简单case函数 case sex when ' then '男' when ' then '女’ else '其他' end --ca ...

  6. MYSQL 三元 函数

    mysql函数之流程控制-FreeOAhttp://www.freeoa.net/osuport/db/mysql-control-fun_2143.html mysql如何利用三元算法判断数字奇偶性 ...

  7. 网站之.htaccess文件

    Apache系统中的.htaccess文件(分布式配置文件)提供了针对目录改变配置的方法,也就是在一个特定的文件目录中放置一个包含指令的文件,以作用于此目录以及所有子目录.直白的说,.htaccess ...

  8. jmeter压测参数设定(转)

    jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...

  9. java中的定时任务小示例

    package package_1; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; ...

  10. scroll滚动条样式修改

    一般我们有两种情况会出现滚动条,一种是overflow,一种是使用scroll. 当我们需要改变这个滚动条样式的时候,我们需要做以下的修改: html: <div id="style- ...