51Nod 1584 加权约数和


要求:\(\sum_{i=1}^n\sum_{j=1}^n\max(i,j)\sigma_1(ij)\)

枚举\(\max(i,j)\),式子变为:\(2\sum_{i=1}^ni\sum_{j=1}^i\sigma_1(ij)-\sum_{i=1}^ni\sigma_1(i^2)\)

这里不加证明地给出结论:\(\sigma_1^k(ij)=\sum_{p|i}\sum_{q|j}(p\frac{j}{q})^k[\gcd(p,q)=1]\)

先看右边部分,可以线性筛\(\sigma_1(n^2)\)。

(筛约数个数和的方法:\(\sigma_1(n=\prod_{i=1}^mp_i^{e_i})=\prod_{i=1}^m(1+p_i+\cdots+p_i^{e_i})\),筛平方的约数个数和类似,事实上任意\(k\)次方的都能筛)

或者也可以推式子:

\(\sum_{i=1}^ni\sigma_1(i^2)\)

\(=\sum_{i=1}^ni\sum_{p|i}\sum_{q|i}p\frac iq\sum_{d|p,d|q}\mu(d)\)

\(=\sum_{i=1}^ni\sum_{p|i}\sum_{q|i}p\frac iq\sum_{d|p,d|q}\mu(d)\)

\(=\sum_{i=1}^ni\sum_{d|i}\mu(d)\sum_{d|p}^ip\sum_{d|q}^i\frac iq\)

\(=\sum_{i=1}^ni\sum_{d|i}\mu(d)\sum_{p|\frac id}^idp\sum_{q|\frac id}^i\frac i{dq}\)

\(=\sum_{i=1}^ni\sum_{d|i}\mu(d)d\sigma_1(\frac id)^2\)

左边部分类似,直接写结论了:

\(\sum_{i=1}^ni\sum_{j=1}^i\sigma_1(ij)=\sum_{i=1}i\sum_{d|i}\mu(\frac id)(\frac id)\sigma_1(d)S_{\sigma_1}(d)\)

其中\(S_f(n)=\sum_{i=1}^nf(i)\)


右边用线性筛:

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1000000007
typedef long long ll;
il ll gi(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch))f^=ch=='-',ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f?x:-x;
}
int pr[1000010],P,sd[1000010],_sd[1000010],sum[1000010],ssd[1000010],mu[1000010];
int sd2[1000010],_sd2[1000010],ssd2[1000010],sum2[1000010];
bool yes[1000010];
int ans[1000010];
int main(){
#ifdef XZZSBfreopen("in.in","r",stdin);freopen("out.out","w",stdout);
#endifint N=1000000;sd[1]=sd2[1]=1;mu[1]=1;for(int i=2;i<=N;++i){if(!yes[i])pr[++P]=i,sd[i]=sum[i]=i+1,_sd[i]=1,mu[i]=mod-1,sd2[i]=sum2[i]=(1+i+1ll*i*i)%mod,_sd2[i]=1;for(int j=1;j<=P&&i*pr[j]<=N;++j){yes[i*pr[j]]=1;if(i%pr[j]==0){sum[i*pr[j]]=(1ll*sum[i]*pr[j]+1)%mod;sd[i*pr[j]]=1ll*_sd[i]*sum[i*pr[j]]%mod;_sd[i*pr[j]]=_sd[i];sum2[i*pr[j]]=(1ll*sum2[i]*pr[j]%mod*pr[j]+pr[j]+1)%mod;sd2[i*pr[j]]=1ll*_sd2[i]*sum2[i*pr[j]]%mod;_sd2[i*pr[j]]=_sd2[i];mu[i*pr[j]]=0;break;}sum[i*pr[j]]=1+pr[j];sd[i*pr[j]]=1ll*sd[i]*sum[i*pr[j]]%mod;_sd[i*pr[j]]=sd[i];sum2[i*pr[j]]=(1ll*pr[j]*pr[j]+pr[j]+1)%mod;sd2[i*pr[j]]=1ll*sd2[i]*sum2[i*pr[j]]%mod;_sd2[i*pr[j]]=sd2[i];mu[i*pr[j]]=mod-mu[i];}}for(int i=1;i<=N;++i)ssd[i]=(ssd[i-1]+sd[i])%mod;for(int i=1;i<=N;++i)ssd2[i]=(ssd2[i-1]+1ll*i*sd2[i])%mod;for(int i=1;i<=N;++i)for(int j=i;j<=N;j+=i)if(mu[i])ans[j]=(ans[j]+2ll*j*mu[i]%mod*i%mod*sd[j/i]%mod*ssd[j/i])%mod;for(int i=1;i<=N;++i)ans[i]=(ans[i]+ans[i-1])%mod;int T=gi(),n;for(int i=1;i<=T;++i)n=gi(),printf("Case #%d: %d\n",i,(ans[n]-ssd2[n]+mod)%mod);return 0;
}

右边用推式子:

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1000000007
typedef long long ll;
il ll gi(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch))f^=ch=='-',ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f?x:-x;
}
int pr[1000010],P,sd[1000010],_sd[1000010],sum[1000010],ssd[1000010],mu[1000010];
bool yes[1000010];
int ans[1000010];
int main(){
#ifdef XZZSBfreopen("in.in","r",stdin);freopen("out.out","w",stdout);
#endifint N=1000000;sd[1]=1;mu[1]=1;for(int i=2;i<=N;++i){if(!yes[i])pr[++P]=i,sd[i]=i+1,_sd[i]=1,sum[i]=i+1,mu[i]=mod-1;for(int j=1;j<=P&&i*pr[j]<=N;++j){yes[i*pr[j]]=1;if(i%pr[j]==0){sum[i*pr[j]]=(1ll*sum[i]*pr[j]+1)%mod;sd[i*pr[j]]=1ll*_sd[i]*sum[i*pr[j]]%mod;_sd[i*pr[j]]=_sd[i];mu[i*pr[j]]=0;break;}sum[i*pr[j]]=1+pr[j];sd[i*pr[j]]=1ll*sd[i]*sum[i*pr[j]]%mod;_sd[i*pr[j]]=sd[i];mu[i*pr[j]]=mod-mu[i];}}for(int i=1;i<=N;++i)ssd[i]=(ssd[i-1]+sd[i])%mod;for(int i=1;i<=N;++i)for(int j=i;j<=N;j+=i){ans[j]=(ans[j]+2ll*j*mu[j/i]%mod*(j/i)%mod*sd[i]%mod*ssd[i])%mod;ans[j]=(ans[j]-1ll*j*mu[i]%mod*i%mod*sd[j/i]%mod*sd[j/i]%mod+mod)%mod;}for(int i=1;i<=N;++i)ans[i]=(ans[i]+ans[i-1])%mod;int T=gi(),n;for(int i=1;i<=T;++i)n=gi(),printf("Case #%d: %d\n",i,ans[n]);return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/11142149.html

51Nod 1584 加权约数和相关推荐

  1. 【51nod】 最小约数 V2

    [51nod] 最小约数 V2 题目 解题思路 用vector,防止爆数组 先将所有数排序,满足输出要从小到大 然后求出每个数除1外的最小约数 最后输出答案 代码 #include<algori ...

  2. 51Nod1584 加权约数和-题解

    又是一道非常神奇的数论题,学到了很多又花了一晚上QWQ [题目地址] 题目大意 多组询问T≤50000T\leq 50000T≤50000,每次给定一个n≤106n\leq 10^6n≤106,询问下 ...

  3. 51nod1584加权约数和

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

  4. 浅谈积性函数求前缀和

    转载至https://blog.csdn.net/skywalkert/article/details/50500009 前置技能 积性函数的定义 若f(n)f(n)的定义域为正整数域,值域为复数,即 ...

  5. 知识点 - 数论函数导论

    知识点 - 数论进阶 abstract:整除分块,积性函数,线性筛,莫比乌斯反演,迪利克雷卷积,积性函数前缀和,杜教筛,阁洲筛,min_25筛 0.引入 Gym - 101485D debugging ...

  6. 浅谈一类积性函数的前缀和(转载)

    本文转自:http://blog.csdn.net/skywalkert/article/details/50500009 另外,莫比乌斯反演和杜教筛其他可转到 http://blog.leanote ...

  7. 【算法总结】积性函数相关

    [线性筛] [模板代码] [线性筛质数] 1 int main() 2 { 3 n=read(); 4 for(int i=2;i<=n;i++) 5 { 6 if(!f[i])pri[++cn ...

  8. 2020.9月做题记录

    八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...

  9. 51NOD 1220 约数之和(杜教筛)

    1220 约数之和 推式子 ∑i=1n∑j=1nd(i,j)=∑i=1n∑j=1n∑x∣i∑y∣j(gcd(x,y)=1)xjy=∑d=1ndμ(d)∑i=1nd∑x∣iix∑j=1nd∑y∣jj=∑ ...

最新文章

  1. BZOJ5319 洛谷4559 LOJ2551:[JSOI2018]军训列队——题解
  2. 并发基础(九) java线程的终止与中断
  3. php中angular,Angular是什么
  4. 高级系统项目管理师笔记1
  5. mysql 辅助索引_MySQL InnoDB B+tree索引
  6. django-多级联动课堂版0912
  7. 【英语学习】【Level 07】U02 Live Work L4 Welcome to my neighborhood
  8. 2008年下半年软考在即 51CTO将实时提供试题和参考答案
  9. 6.SpringMVC 配置式开发-处理器
  10. 2003系统企业版镜像服务器,Windows Server 2003 R2/SP2简体中文企业版原版镜像
  11. 【Anychart】自动保存flash图片到指定目录下。
  12. python实现输入城市查询天气
  13. 2020最新教师资格证《中学综合素质》必考知识点大全
  14. 金蝶标准版的服务器文件,金蝶标准版服务器设置
  15. mysql报1032_MySQL SQL_ERROR 错误号 1032解决办法
  16. Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization.
  17. CentOS 8安装源设置基础软件仓库时出错
  18. 国内外主流静态分析类工具汇总
  19. MySQL 重置 root 密码以及修改密码时报错password字段不存在
  20. 行业大数据应用-复习

热门文章

  1. 在C++中使用CognexVisionpro (修订2.0)
  2. 云徙探险中台赛道:借道云原生,寻找“最优路线”
  3. 【JVM】内存结构(下)
  4. 2023年郑州春招3年开发面试总结
  5. CGAL-由多面体Polyhedron_3输出obj文件
  6. 组合数学-离散数学重点摘记
  7. 女生学有关计算机的什么专业好,女生学计算机专业好吗 适合的岗位有哪些
  8. uniapp用html5做的案例,uni-app demo
  9. 4万字总结,关于数据仓库与数据湖
  10. Mr.D_速学“凯利公式”