51Nod1584 加权约数和
这题其实就是反演一波就好了(那你还推了一下午+一晚上),不过第一次碰到\(O(n\log n)\)预处理分块和式的方法……
不知为啥我跟唐教主的题解推的式子不太一样……(虽然本质上可能是相同的吧)
那就写一写好了,顺便骗点访问量(逃
\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}\]
\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}\]
\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}\]
\]
到了这里就可以用\(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 加权约数和的更多相关文章
- 51nod1584加权约数和
题目大意: 求: \[ \sum_{i-1}^n\sum_{j=1}^nmax(i,j)\sigma(i*j) \] 题解 对于这个\(\max\),套路的把它转化成: \[ 2*\sum_{i=1} ...
- 【51Nod1584】加权约数和(数论)
[51Nod1584]加权约数和(数论) 题面 51Nod 题解 要求的是\[\sum_{i=1}^n\sum_{j=1}^n max(i,j)\sigma(ij)\] 这个\(max\)太讨厌了,直 ...
- 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] 加权约数和
Description 在整理以前的试题时,他发现了这样一道题目:"求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和.&quo ...
- 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 ...
- Solution -「51nod 1584」加权约数和
\(\mathcal{Description}\) Link. 令 \(\sigma(n)\) 为 \(n\) 的约数之和.求: \[\sum_{i=1}^n\sum_{j=1}^n\max\ ...
- T1加权像(T1 weighted image,T1WI)
T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响. 弛豫:物理用语,从某一个状态恢复到平衡态的过 ...
随机推荐
- [Swift实际操作]七、常见概念-(4)范围CGRect的使用详解
本文将为你演示区域对象CGRect的使用.你可以将区域对象,看作是点对象和尺寸对象的组合 首先导入需要使用到底界面工具框架 import UIKit 然后初始化一个区域对象,它的原点位于(0,0),宽 ...
- maven添加仓库没有的jar包
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging= ...
- 如何查看linux服务器的版本和配置信息
linux下看配置,可没有windows那么直观.你只能一个一个查看. 一:cpu[root@srv /]# more /proc/cpuinfo | grep "modelname&quo ...
- iOS根据图片url获取尺寸
可以在UIImage的分类中加入下面的代码,并且引入系统的ImageIO.framework /** 根据图片的url获取尺寸 @param URL url @return CGSize */ + ( ...
- Ubuntu16.04 Nvidia驱动、CUDA安装
安装Nvidia驱动和CUDA时往往很费力,经常有莫名奇妙的错误,这次安装十分顺畅,权当记录一下,以方便以后再次安装. 一.Nvidia显卡驱动安装 sudo add-apt-repository p ...
- 剑指offer三十之连续子数组的最大和
一.题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- django第一课 简单的网页视图
注意本人django版本2.0 python3.6 第一步:创建自己的django项目 django-admin.py startproject ** 第二步:进入**创建app pytho ...
- VUE之文字跑马灯效果
VUE之文字跑马灯效果 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> <me ...
- Names and Identifiers
JLS:https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.2 Not all identifiers in a pr ...
- nginx配置负载均衡,tomcat宕机响应缓慢,自动切换的问题
用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问http://localhost 速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是我们试验性的把其中一台tomcat( ...