题面

题目要我们求这个:

\[\sum_{i=1}^n lcm(i,n)
\]

开始化式子:

\[\sum_{i=1}^{n} \frac{i*n}{gcd(i,n)}
\]

\[\sum_{d|n} \sum_{i=1}^{\frac{n}{d}} i*n[gcd(i,\frac{n}{d})=1]
\]

\[n*\sum_{d|n}\sum_{i=1}^{d}i[gcd(i,d)=1]
\]

注意那个\(\sum_{i=1}^{d}i[gcd(i,d)=1]\)是求\([1,d]\)中所有与\(d\)互质的数的和,可以证明当\(d>1\)时,它等于\(\frac{d*\phi(d)}{2}\),证明如下:

对于每个\(i\),若它与\(d\)互质,则\(d-i\)也与\(d\)互质,每一对\(i\)与\(d-i\)的和为\(d\),所以平均每个与\(d\)互质的数的值为\(\frac{d}{2}\),一共有\(\phi(d)\)个与\(d\)互质的数,所以他们的和为\(\frac{d*\phi(d)}{2}\)

而与\(1\)互质的数的和显然为\(1\)

所以上式可化为

\[n*\big((\sum_{d|n,d>1}\frac{d*\phi(d)}{2})+1\big)
\]

\[\big( \frac{n}{2}*\sum_{d|n,d>1}d*\phi(d)\big)+n
\]

设\(g(n)=\sum_{d|n}d*\phi(d)\),上式化为:

\[\frac{n}{2}*(g(n)-1)+n
\]

其中\(g(n)\)是一个积性函数,可以\(O(n)\)筛出

每次询问是\(O(1)\)的

总时间复杂度为\(O(n+T)\)

关于如何线筛出\(g(n)\):

\(n\)为质数:\(g(n)=1+n*\phi(n)=1+n*(n-1)\)

\(n=p^k\):

\[g(n)=1+\sum_{i=1}^{k}p^i*\phi(p^i)
\]

\[=1+\sum_{i=1}^{k}p^i*p^{i-1}*(p-1)
\]

\[=1+(p-1)\sum_{i=1}^{k}p^{2i-1}
\]

\[=1+(p-1)\frac{p^{2k+1}-p}{p^2-1}
\]

\[=1+\frac{p^{2k+1}-p}{p+1}
\]

\(n\)的最小质因子为\(p\):\(g(n)=g(n'*p^k)=g(n')*g(p^k)\)

然后就可以线性筛了

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 1000007
#define ll long long
const int lim=1e6;
int pr[N],cnt,pk[N];
bool zhi[N];
ll f[N];
void Init()
{
int i,j;
f[1]=1;
for(i=2;i<=lim;i++)
{
if(!zhi[i])
{
pr[++cnt]=i,f[i]=1+1ll*i*(i-1);
pk[i]=i;
}
for(j=1;j<=cnt&&i*pr[j]<=lim;j++)
{
int p=pr[j],x=i*p;
zhi[x]=true;
if(i%p==0)
{
pk[x]=pk[i]*p;
f[x]=f[x/pk[x]]*(1+(1ll*pk[x]*pk[x]*p-p)/(p+1));
break;
}
pk[x]=p;
f[x]=f[i]*f[p];
}
}
for(i=1;i<=lim;i++)
f[i]=1ll*(f[i]-1)*i/2+i;
}
int main()
{
int t,n;
Init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%lld\n",f[n]);
}
return 0;
}

我原本的做法是用\(\mu\)暴力拆\([gcd(i,d)=1]\),但是那样做的复杂度是\(O(n\log n)\)的,也没有这个做法巧妙,这里就不讲了。

SP5971 LCMSUM 数论的更多相关文章

  1. bzoj 2226: [Spoj 5971] LCMSum 数论

    2226: [Spoj 5971] LCMSum Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 578  Solved: 259[Submit][St ...

  2. BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2226 题解: 题目要求的是Σn*i/gcd(i,n) i∈[1,n] 把n提出来变成Σi/g ...

  3. SP5971 LCMSUM - LCM Sum

    一个基于观察不依赖于反演的做法. 首先 \(\rm lcm\) 是不好算的,转化为计算 \(\rm gcd\) 的问题,求: \[\sum\limits_{i = 1} ^ n \frac{in}{\ ...

  4. X000011

    P1890 gcd区间 \(\gcd\) 是满足结合律的,所以考虑用 ST 表解决 时间复杂度 \(O((n\log n+m)\log a_i)\) 考虑到 \(n\) 很小,你也可以直接算出所有的区 ...

  5. 初等数论学习笔记 III:数论函数与筛法

    初等数论学习笔记 I:同余相关. 初等数论学习笔记 II:分解质因数. 1. 数论函数 本篇笔记所有内容均与数论函数相关.因此充分了解各种数论函数的名称,定义,符号和性质是必要的. 1.1 相关定义 ...

  6. gcd套路变换

    gcd套路变换 GCD https://www.luogu.org/problem/P2568 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. $ 1& ...

  7. BZOJ 2226 [Spoj 5971] LCMSum 最大公约数之和 | 数论

    BZOJ 2226 [Spoj 5971] LCMSum 这道题和上一道题十分类似. \[\begin{align*} \sum_{i = 1}^{n}\operatorname{LCM}(i, n) ...

  8. bzoj 2401: 陶陶的难题I 数论

    2401: 陶陶的难题I Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 24[Submit][Status] Descript ...

  9. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

随机推荐

  1. [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up IDEA2019的database插件无法链接mysql的解决办法(08001错误)

    [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. 点击这里 ...

  2. 2019 金蝶java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.金蝶等公司offer,岗位是Java后端开发,因为发展原因最终选择去了金蝶,入职一年时间了,也成为了面试官,之 ...

  3. 修改docker容器参数

    创建容器时没有添加参数  --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动. docker container update --restart=alway ...

  4. 【转载】如何删除Windows远程桌面保存的账号密码数据

    在Windows系统中,无论是win7.win8还是win10系统,都可使用Windows系统自带的远程桌面连接工具来远程服务器,很多时候Windows远程桌面在连接一次后会自动保存连接的账号密码等信 ...

  5. js 递归遍历对象 插入属性 遍历树结构

    // 向 info下面 每一项 插入 isShow test() { const _this = this; _this.info.isShow = false; let iteration = fu ...

  6. JavaScript 之 offset 、client、scroll

    下面这三组是关于元素大小.位置相关的属性 一.offset 偏移量 1.offsetParent 该属性获取距离当前元素最近的定位父元素,如果没有定位父元素此时是 body 元素 2.offsetLe ...

  7. Mysql连接数过多、Mysql连接错误过多的问题处理

    在使用Mysql的过程中,你总是会遇到这样那样的问题,每次去网上查找也相对比较麻烦,所以在此整理一下(以linux ubantu16 系统为例). ========================== ...

  8. 【python】多任务(2. 进程)

    进程间通信 Queue import multiprocessing def download_from_web(q): # 模拟从网上下载数据 data = [11, 22, 33, 44] for ...

  9. Linux命令head

    1.命令简介 head (head) 用来显示档案的开头至标准输出中.如果指定了多于一个文件,在每一段输出前会给出文件名作为文件头.如果不指定文件,或者文件为"-",则从标准输入读 ...

  10. 【OS_Windows】Win10应用商店闪退和点击Cortana搜索框闪退的解决方法

    Windows10用户遇到了打开应用商店时闪退和点击Cortana小娜搜索框闪退的问题,并且在微软社区求助,得到了一种可行的解决方法,那就是查看Network List Service(网络列表服务) ...