题目

d(k)表示k的所有约数的和。d(6) = 1 + 2 + 3 + 6 = 12。

定义S(N) = ∑1<=i<=N ∑1<=j<=N d(i*j)。

例如:S(3) = d(1) + d(2) + d(3) + d(2) + d(4) + d(6) + d(3) + d(6) + d(9) = 59,S(1000) = 563576517282。

给出正整数N,求S(N),由于结果可能会很大,输出Mod 1000000007(10^9 + 7)的结果。

分析

分开处理每个质因子,于是\(d(i*j)=\sum_{p|i}\sum_{q|j}\dfrac{iq}{p}[gcd(p,q)=1]\)

\[ans=\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{p|i}\sum_{q|j}\dfrac{iq}{p}[gcd(p,q)=1]
\]

上一波反演,

\[=\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{p|i}\sum_{q|j}\dfrac{iq}{p}[d|gcd(p,q)]
\]

\[=\sum_{d=1}^{n}\mu(d)\sum_{p|i}\sum_{q[j}\dfrac{q}{p}\sum_{p[i}i\sum_{q[j}
\]

\[=\sum_{d=1}^{n}\mu(d)\sum_{p|i}\sum_{q[j}\dfrac{q}{p}{\lfloor\dfrac{n}{q}\rfloor}{p\dfrac{\lfloor\dfrac{n}{p}\rfloor(\lfloor\dfrac{n}{p}\rfloor+1)}{2}}
\]

\[=\sum_{d=1}^{n}\mu(d)d(\sum_{p=1}^{\lfloor\frac{n}{d}\rfloor}q{\lfloor\dfrac{n}{dq}\rfloor})(\sum_{q=1}^{\lfloor\frac{n}{d}\rfloor}{\dfrac{\lfloor\dfrac{n}{dp}\rfloor(\lfloor\dfrac{n}{dp}\rfloor+1)}{2}})
\]

考虑处理\(\sum_{q=1}^{\lfloor\frac{n}{d}\rfloor}{\dfrac{\lfloor\dfrac{n}{dp}\rfloor(\lfloor\dfrac{n}{dp}\rfloor+1)}{2}}\)

用\(n\)代替\(\lfloor\dfrac{n}{d}\rfloor\)

\[\sum_{i=1}^{n}{\dfrac{\lfloor\dfrac{n}{i}\rfloor(\lfloor\dfrac{n}{i}\rfloor+1)}{2}}
\]

\[=\sum_{i=1}^{n}\sum_{j=1}^{\lfloor\dfrac{n}{i}\rfloor}j
\]

\[=\sum_{j=1}^{n}j\sum_{i=1}^{\lfloor\dfrac{n}{j}\rfloor}
\]

\[=\sum_{j=1}^{n}j\lfloor\dfrac{n}{j}\rfloor(事实上,这就等于\sum_{j=1}^{n}d(j))
\]

\[ans=\sum_{d=1}^{n}\mu(d)d(\sum_{p=1}^{\lfloor\frac{n}{d}\rfloor}q{\lfloor\dfrac{n}{dq}\rfloor})^2
\]

于是对于两层\(\sum\)都分块处理

类似与【51nod 2026】Gcd and Lcm,可以用杜教筛处理\(\mu(d)d\)的前缀和。

对于\(\sum_{j=1}^{n}j\lfloor\dfrac{n}{j}\rfloor\),直接上分块。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
const int maxlongint=2147483647;
const long long mo=1e9+7;
const int lim=1e5+7;
const int N=10000005;
using namespace std;
#define sqr(x) (1ll*(x)*(x)%mo)
#define val(x,y) (1ll*(y-x+1)*(x+y)/2%mo)
int p[N],mu[N],n,ha[lim+5][2],s[N],ans;
bool bz[N];
int get(int v)
{
int x;
for(x=v%lim;ha[x][0] && ha[x][0]!=v;(++x)-=x>=lim?lim:0);
return x;
}
int S(int m)
{
if(m<=N-5) return s[m];
int pos=get(m);
if(ha[pos][0]) return ha[pos][1];
ha[pos][0]=m;
int la=0,sum=0;
for(int i=2;i<=m;i=la+1)
{
la=m/(m/i);
sum=(1ll*sum+1ll*val(i,la)*S(m/i))%mo;
}
return ha[pos][1]=(1-sum+mo)%mo;
}
int main()
{
scanf("%d",&n);
mu[1]=s[1]=1;
for(int i=2;i<=N-5;i++)
{
if(!bz[i]) mu[p[++p[0]]=i]=-1;
s[i]=(s[i-1]+mu[i]*i+mo)%mo;
for(int j=1,k;j<=p[0] && (k=i*p[j])<=N-5;j++)
{
bz[k]=true;
if(i%p[j]==0) break;
mu[k]=-mu[i];
}
}
int la=1;
for(int i=1;i<=n;i=la+1)
{
la=n/(n/i);
int last=1,nn=n/i,sum=0;
for(int j=1;j<=nn;j=last+1)
{
last=nn/(nn/j);
sum=(1ll*sum+1ll*(val(j,last))*(nn/j))%mo;
}
ans=(1ll*ans+1ll*(S(la)-S(i-1)+mo)*sqr(sum))%mo;
}
printf("%d",ans);
}

【51nod1220】约数之和的更多相关文章

  1. 51nod1220 约数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1220 $G(n)=\sum\limits_{i=1}^n\sum\lim ...

  2. [51nod1220] 约数之和(杜教筛+莫比乌斯反演)

    题面 传送门 题解 嗯--还是懒得写了--这里 //minamoto #include<bits/stdc++.h> #define R register #define IT map&l ...

  3. 51NOD 1220 约数之和 [杜教筛]

    1220 约数之和 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_1(ij)​\) \[ \sigma_0(ij) = \sum_{x\mid i}\sum_{y\mi ...

  4. 【动态规划】mr359-最大公约数之和

    [题目大意] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入一个正整数S. 输出最大的约数之和. 样例输入 Sample Input 11 样例输出 Sample ...

  5. 51Nod 约数之和

                              1220 约数之和                                  题目来源: Project Euler 基准时间限制:3 秒 ...

  6. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

  7. [51Nod 1220] - 约数之和 (杜教筛)

    题面 令d(n)d(n)d(n)表示nnn的约数之和求 ∑i=1n∑j=1nd(ij)\large\sum_{i=1}^n\sum_{j=1}^nd(ij)i=1∑n​j=1∑n​d(ij) 题目分析 ...

  8. POJ1845Sumdiv题解--约数之和

    题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...

  9. ZZNU 正约数之和

    #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #incl ...

随机推荐

  1. TensorFlow实战第八课(卷积神经网络CNN)

    首先我们来简单的了解一下什么是卷积神经网路(Convolutional Neural Network) 卷积神经网络是近些年逐步兴起的一种人工神经网络结构, 因为利用卷积神经网络在图像和语音识别方面能 ...

  2. 【机器学习】Learning to Rank之Ranking SVM 简介

    Learning to Rank之Ranking SVM 简介 排序一直是信息检索的核心问题之一,Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning t ...

  3. mysql 速度优化

    1.添加索引 ALTER TABLE `cw_base_house` ADD INDEX idx_house ( `villageCode`, `buildingNo`, `unitNo`, `hou ...

  4. aliyun挂载oss

    配置 oss 挂载 阿里云 ecs 按照ossfs工具:yum install http://gosspublic.alicdn.com/ossfs/ossfs_1.80.5_centos6.5_x8 ...

  5. PostgreSQL unlogged表

    PostgreSQL有一种介于正常表和临时表之间的类型表,称之为unlogged表,在该表新建的索引也属于unlogged,该表在写入数据时候并不将数据写入到持久的write-ahead log文件中 ...

  6. 【转帖】msvcp100.dll和msvcr100.dll

    VS发布软件时去除msvcp100.dll和msvcr100.dll图解说明 https://blog.csdn.net/yu__jia/article/details/82753262 msvcp. ...

  7. 【图论好题】ABC #142 Task F Pure

    题目大意 给定一个 $N$ 个点 $M$ 条边的有向图 $G$,无重边.自环.找出图 $G$ 的一个导出子图(induced subgraph) $G'$,且 $G'$ 中的每个点的入度和出度都是 1 ...

  8. CodeFoeces GYM 101466A Gaby And Addition (字典树)

    gym 101466A Gaby And Addition 题目分析 题意: 给出n个数,找任意两个数 “相加”,求这个结果的最大值和最小值,注意此处的加法为不进位加法. 思路: 由于给出的数最多有 ...

  9. Codeforces 1221F. Choose a Square

    传送门 对于某个点 $(x,y)$ ,不妨设 $x<y$ 因为如果 $x>y$ 直接按 $y=x$ 对称一下即可 当且仅当正方形左下角 $(a,a)$ 满足 $a<=x$,右上角 $ ...

  10. python+minicap的使用

    说起Minicap,不得不提到STF,STF (Smartphone Test Farm) 是一个开源的web架构应用,用户可通过浏览器远程操作Android设备.调试Android应用.在设备上进行 ...