这题其实就是反演一波就好了(那你还推了一下午+一晚上),不过第一次碰到\(O(n\log n)\)预处理分块和式的方法……

不知为啥我跟唐教主的题解推的式子不太一样……(虽然本质上可能是相同的吧)

那就写一写好了,顺便骗点访问量(逃

\[\begin{align}
\nonumber\text{Let}\space A=&\sum_{i=1}^n\sum_{j=1}^i i\sigma_1(ij),B=\sum_{i=1}^n i\sigma_1(i^2)\\
\nonumber\text{Then}\space Ans=&2A-B\\
\end{align}\]

\[\begin{align}
\nonumber A=&\sum_{i=1}^n\sum_{j=1}^i i\sigma_1(ij)\\
\nonumber =&\sum_{i=1}^n\sum_{j=1}^i i\sum_{p|i}\sum_{q|j}[(p,q)=1]\frac{pj}q\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{i=1}^n\sum_{j=1}^i i\sum
_{p|i}\sum_{q|j}[d|(p,q)]\frac{pj}q\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{d|p}p\left(\sum_{p|i}i\right)\sum_{d|q}\sum_{q|j}^i \frac j q\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{p=1}^{\left\lfloor\frac n d\right\rfloor}dp\left(\sum_{p|i}^{\left\lfloor\frac n d\right\rfloor}di\right)\sum_{q=1}^{\left\lfloor\frac n d\right\rfloor}\sum_{q|j}^i \frac{dj}{dq}\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{p=1}^{\left\lfloor\frac n d\right\rfloor}dp\left(\sum_{p|i}^{\left\lfloor\frac n d\right\rfloor}di\right)\sum_{q=1}^i\sum_{q|j}^i \frac j q\\
\nonumber =&\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor}i\left(\sum_{p|i}p\right)\sum_{j=1}^i\sum_{q|j}\frac j q\\
\nonumber =&\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor}i\sigma_1(i)\sum_{j=1}^i\sigma_1(j)\\
\nonumber =&\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor}i\sigma_1(i)S_{\sigma_1}(i)
\end{align}\]

\[\begin{align}
\nonumber B=&\sum_{i=1}^n i\sigma_1(i^2)\\
\nonumber =&\sum_{i=1}^n i\sum_{p|i}\sum_{q|j}[(p,q)=1]\frac{pi}q\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{i=1}^n i\sum_{p|i}\sum_{q|j}[d|(p,q)]\frac{pi}q\\
\nonumber =&\sum_{d=1}^n\mu(d)\sum_{d|i} i\sum_{d|p|i}\sum_{d|q|j}\frac{pi}q\\
\nonumber =&\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor} i\sum_{p|i}\sum_{q|j}p\frac i q\\
\nonumber =&\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor} i\sigma_1^2(i)\\
\end{align}\]

\[Ans=2A-B\\=\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{\left\lfloor\frac n d\right\rfloor}i\sigma_1(i)\left(2S_{\sigma_1}(i)-\sigma_1(i)\right)
\]

到了这里就可以用\(O(n)\)预处理+单次询问\(O(\sqrt n)\)的经典做法了,总复杂度\(O(n+T\sqrt n)\)。

但是这样还是有点慢……常数优化到一定程度之后极限数据仍然要跑2s+(卡常技巧不行……逃),看来常数优化玩不了了,只能试试别的做法。

考虑枚举\(d\)和\(k=\left\lfloor\frac n d\right\rfloor\),并考虑它们能对哪些\(n\)作出贡献。不难发现,如果\(\left\lfloor\frac n d\right\rfloor=k\),那么一定有\(n\in[dk,d(k+1))\),再稍加观察就能得到每对\((d,k)\)都会对\(\ge dk\)的所有\(n\)作出贡献,因此枚举所有\(d,k\)并差分一下,最后求一遍前缀和即可。

这样就能做到预处理\(O(n\log n)\),询问\(O(1)\)了,不用卡常也可以过。

#pragma GCC optimize("Ofast")
#include<stdio.h>
#define int unsigned
using namespace std;
template<class T>inline void readint(T &v){
int x=0;
char c=getchar();
while(c<48)c=getchar();
while(c>47){
x=x*10+(c^48);
c=getchar();
}
v=x;
}
template<class T>inline void writeint(T x){
static int a[25];
if(!x)putchar('0');
else{
int i=0;
while(x){
a[++i]=x%10;
x/=10;
}
while(i)putchar(a[i--]^48);
}
}
const int maxn=1000010,p=1000000007;
void get_table(int);
bool notp[maxn];
int prime[maxn],mu[maxn],sigma[maxn],ans[maxn],f[maxn];
signed main(){
get_table(1000000);
int T;
readint(T);
for(int k=1;k<=T;k++){
int n;
readint(n);
putchar('C');
putchar('a');
putchar('s');
putchar('e');
putchar(' ');
putchar('#');
writeint(k);
putchar(':');
putchar(' ');
writeint(ans[n]);
putchar('\n');
}
return 0;
}
void get_table(int n){
mu[1]=sigma[1]=1;
for(int i=2;i<=n;i++){
if(!notp[i]){
prime[++prime[0]]=i;
mu[i]=-1;
sigma[i]=i+1;
f[i]=1;
}
for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
notp[i*prime[j]]=true;
if(i%prime[j]){
mu[i*prime[j]]=-mu[i];
sigma[i*prime[j]]=(long long)sigma[i]*(prime[j]+1)%p;
f[i*prime[j]]=i;
}
else{
if(f[i]==1)sigma[i*prime[j]]=((long long)prime[j]*sigma[i]+1)%p;
else sigma[i*prime[j]]=(long long)sigma[i/f[i]*prime[j]]*sigma[f[i]]%p;
f[i*prime[j]]=f[i];
}
}
}
for(int i=2,sum=1;i<=n;i++){
sum+=sigma[i];
if(sum>=p)sum-=p;
sigma[i]=(long long)i*sigma[i]%p*(2ll*sum-sigma[i]+p)%p;
}
for(int i=1;i<=n;i++){
int t=((long long)i*i%p*(signed)mu[i]+p)%p;
for(int j=1;i*j<=n;j++)ans[i*j]=(ans[i*j]+(long long)t*sigma[j])%p;
}
for(int i=2;i<=n;i++){
ans[i]+=ans[i-1];
if(ans[i]>=p)ans[i]%=p;
}
}

51Nod1584 加权约数和的更多相关文章

  1. 51nod1584加权约数和

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

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

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

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

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

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

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

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

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

  6. 51nod 1584加权约数和

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

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

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

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

  9. T1加权像(T1 weighted image,T1WI)

    T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响. 弛豫:物理用语,从某一个状态恢复到平衡态的过 ...

随机推荐

  1. [Virus Analysis]恶意软件分析(二)玩出花的批处理(中)

    本文作者:i春秋作家——Sp4ce 0×01上一篇文章部分 首先是文件目录 整理后的目录 整理前的部分文件代码 update.bat %%Q %%Q %%Q %%Q %%Q %%Q %%Q %%Q % ...

  2. IntelliJ IDEA优秀插件(编程通用)

    一.IntelliJ IDEA开发 最近大部分开发IDE工具都切换到了,所以也花了点心思去找了相关的插件.这里整理的适合各种语言开发的通用插件,也排除掉IntelliJ IDEA自带的常用插件了(有些 ...

  3. JDK源码学习之 集合实现类

    一.HashMap (1) 简介:java1.8版本之前HashMap的结构图如下: 数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单 ...

  4. Linux必备命令

      目录                                                              概述 常用系统工作命令 系统状态检测命令 工作目录切换命令 文本文件 ...

  5. 【ARC072F】 Dam 单调队列

    题目大意: 有一个水库,容量为$L$,一开始是空的.有$n$天. 对于第i天,每天早上有$v_i$单位的,水温为$t_i$的水流进来.每天晚上你可以放掉一些水,多少自定.但是必须保证第二天水库不会溢出 ...

  6. WebDriver高级应用实例(1)

    1.1使用JavaScriptExecutor单击元素 被测网页的网址: http://www.baidu.com Java语言版本的API实例代码 import org.testng.annotat ...

  7. (转)linux如何让历史记录不记录敏感命令

    有时候为了服务器安全,防止别人窥探我们输入的命令,我们可以清空历史记录,而更多的时候,我们选择的是在输入特殊命令时候,强制历史记录不记住该命令.实验方法:先执行export HISTCONTROL=i ...

  8. linux中的tar命令的使用

    参考网址: https://www.cnblogs.com/newcaoguo/p/5896975.html https://www.cnblogs.com/xccjmpc/p/6035397.htm ...

  9. 目录打散-hash算法

    前几篇说了文件上传,都是上传到了WebRoot下的up目录,这样是不行的,文件多了性能就不行了.文件一般都是分目录存放的,这里讲建目录的一种算法.先看结果,经过本算法建的目录,结构是这样的,还以up目 ...

  10. Spring Boot 日志配置

    Spring Boot 日志配置 默认日志 Logback: 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很 ...