[51Nod 1584] 加权约数和
Description
在整理以前的试题时,他发现了这样一道题目:“求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和。”
现在他长大了,题目也变难了,所以麻烦你来帮他解决一道数论题吧。
他需要你求如下表达式的值:
\]
其中 \(\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
〖一〗
\]
证明:原式 \(=\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}^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}
\]
\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)\) 询问,于是进一步化简:
\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] 加权约数和的更多相关文章
- 51NOD 1584 加权约数和 [莫比乌斯反演 转化 Trick]
1584 加权约数和 题意:求\(\sum_{i=1}^{N} \sum_{j=1}^{N} {\max(i,j)\cdot \sigma(i\cdot j)}\) 多组数据\(n \le 10^6, ...
- 51nod 1584 加权约数和 约数和函数小trick 莫比乌斯反演
LINK:加权约数和 我曾经一度认为莫比乌斯反演都是板子题. 做过这道题我认输了 不是什么东西都是板子. 一个trick 设\(s(x)\)为x的约数和函数. 有 \(s(i\cdot j)=\sum ...
- 51nod 1584加权约数和
学到了好多东西啊这题... https://blog.csdn.net/sdfzyhx/article/details/72968468 #include<bits/stdc++.h> u ...
- [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∑Nj=1∑Nmax ...
- 【51Nod1584】加权约数和(数论)
[51Nod1584]加权约数和(数论) 题面 51Nod 题解 要求的是\[\sum_{i=1}^n\sum_{j=1}^n max(i,j)\sigma(ij)\] 这个\(max\)太讨厌了,直 ...
- Solution -「51nod 1584」加权约数和
\(\mathcal{Description}\) Link. 令 \(\sigma(n)\) 为 \(n\) 的约数之和.求: \[\sum_{i=1}^n\sum_{j=1}^n\max\ ...
- 51Nod1584 加权约数和
这题其实就是反演一波就好了(那你还推了一下午+一晚上),不过第一次碰到\(O(n\log n)\)预处理分块和式的方法-- 不知为啥我跟唐教主的题解推的式子不太一样--(虽然本质上可能是相同的吧) 那 ...
- 51nod1584加权约数和
题目大意: 求: \[ \sum_{i-1}^n\sum_{j=1}^nmax(i,j)\sigma(i*j) \] 题解 对于这个\(\max\),套路的把它转化成: \[ 2*\sum_{i=1} ...
- Note -「Mobius 反演」光速入门
目录 Preface 数论函数 积性函数 Dirichlet 卷积 Dirichlet 卷积中的特殊函数 Mobius 函数 & Mobius 反演 Mobius 函数 Mobius 反演 基 ...
随机推荐
- sklearn 数据预处理1: StandardScaler
作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...
- 抛弃配置后的Spring终极教程
一:前言 Spring 有XML配置和注解两种版本,我个人非常喜欢使用注解,相当热衷Spring boot! 对于Spring,核心就是IOC容器,这个容器说白了就是把你放在里面的对象(Bean)进行 ...
- Java之文本文件的创建和读取(含IO流操作)
工具类:对文件的读取,创建.直接复制拿来用! package cn.zyzpp.util; import java.io.BufferedReader; import java.io.Buffered ...
- Ansible 简介
Ansible 是一个开源的基于 OpenSSH 的自动化配置管理工具.可以用它来配置系统.部署软件和编排更高级的 IT 任务,比如持续部署或零停机更新.Ansible 的主要目标是简单和易用,并且它 ...
- H5 18-序选择器
18-序选择器 我是标题 我是段落1 我是段落2 我是段落3 我是段落4 我是段落5 我是段落6 我是段落7 我是段落8 --> 我是段落1 我是段落2 我是段落2 我是标题 <!DOCT ...
- 第十二届湖南省赛 A - 2016 ( 数学,同余转换)
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 ...
- 实现h5中radio单击取消与选中
<input type = "radio" id = "raid" name = "raname" checked = 'checke ...
- 关于R语言中dnorm,pnorm,qnorm,rnorm的用法
dnorm,pnorm,qnorm,rnorm的表达式: 其中x和q是由数值型变量构成的向量,p是由概率构成的向量,n是随机产生的个数 mean是要计算正态分布的均值,缺省值为0,sd是计算正态分布的 ...
- 城市联动 - 自动生成SQL语句
字段比较简单/ 如果有需要可以自己定制字段和排序/ 一共二级城市联动, 本人业务需要, 所以就两层, 网上关于三层的挺多, 有需要可以借鉴/ 废话不多说, 先看效果图, 代码在下面 <?php ...
- 372.Definition of ListNode
单项列表只能把后一个node中的所有数据copy到当前node再delete后一node. /** * Definition of ListNode * class ListNode { * publ ...