51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)
\(Description\)
\(n\leq 10^{10}\),求
\]
\(Solution\)
首先
\]
注意不是\(\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)=\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d]\)!
\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)&=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d]\\
&=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(i,j)=1]\\
&=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)\lfloor\frac{\lfloor\frac{n}{d}\rfloor}{i}\rfloor\lfloor\frac{\lfloor\frac{n}{d}\rfloor}{i}\rfloor\\
&=\sum_{d=1}^nd\sum_{d|t,t\leq n}\mu(\frac{t}{d})(\lfloor\frac{n}{t}\rfloor)^2\\
&=\sum_{t=1}^n(\lfloor\frac{n}{t}\rfloor)^2\sum_{d|t}d\mu(\frac{t}{d})\\
&=\sum_{t=1}^n(\lfloor\frac{n}{t}\rfloor)^2\varphi(t)
\end{aligned}
\]
然后就可以杜教筛了。
最后一步用到$$\sum_{d|n}\frac{n}{d}\mu(d)=\varphi(n)$$
证明:
首先有 \(\sum_{d|n}\varphi(d)=n\)(不证了).
设 \(f(n)=n\),则\(f(n)=\sum_{d|n}\varphi(d)\).
那么 \(\varphi(n)=\sum_{d|n}f(\frac{n}{d})\mu(d)\)
即 \(\sum_{d|n}\frac{n}{d}\mu(d)=\varphi(n)\).
//前缀和不要忘取模。。
#include<cstdio>
#include<cstring>
typedef long long LL;
const int N=4500000,mod=1e9+7;
int P[N>>2],cnt,phi[N+3];
LL n,sum[N+3],sum2[100000];
bool Not_P[N+3];
void Init()
{
phi[1]=1;
for(int i=2;i<=N;++i)
{
if(!Not_P[i]) P[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*P[j]<=N;++j)
{
Not_P[i*P[j]]=1;
if(i%P[j]) phi[i*P[j]]=phi[i]*(P[j]-1);
else {phi[i*P[j]]=phi[i]*P[j]; break;}
}
}
for(int i=1;i<=N;++i) sum[i]=sum[i-1]+phi[i], sum[i]>=mod?sum[i]-=mod:0;
}
LL FP(LL x,LL k)
{
LL t=1;
for(;k;k>>=1,x=x*x%mod)
if(k&1) t=t*x%mod;
return t;
}
const LL inv2=FP(2,mod-2);
LL Calc(LL x)
{
if(x<=N) return sum[x];
else if(~sum2[n/x]) return sum2[n/x];
LL t=x%mod, res=t*(t+1)%mod*inv2%mod;
for(LL i=2,las;i<=x;i=las+1)
las=x/(x/i),(res-=(las-i+1)*Calc(x/i)%mod)%=mod;
return sum2[n/x]=(res+mod)%mod;
}
int main()
{
Init();//scanf("%I64d",&n);
scanf("%lld",&n);
memset(sum2,0xff,sizeof sum2);
LL res=0;
for(LL i=1,las,t;i<=n;i=las+1)
las=n/(n/i), t=n/i%mod, (res+=t*t%mod*(Calc(las)-Calc(i-1)+mod)%mod)%=mod;
printf("%lld",res);
return 0;
}//9800581876
51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)的更多相关文章
- 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- 51NOD 1237 最大公约数之和 V3 [杜教筛]
1237 最大公约数之和 V3 题意:求\(\sum_{i=1}^n\sum_{j=1}^n(i,j)\) 令\(A(n)=\sum_{i=1}^n(n,i) = \sum_{d\mid n}d \c ...
- NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...
- 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】
用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...
- 51nod 1237 最大公约数之和 V3(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...
随机推荐
- k64 datasheet学习笔记4---Memory Map
1.前言 本文主要介绍K64地址空间的映射 2. System Memory Map 3. K64地址映射 4. Armv7m地址映射 4.1 Armv7M.System地址段(0XE0000000~ ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之VMSA
1. 前言 2. VMSA概述 2.1 ARMv8 VMSA naming VMSAv8 整个转换机中,地址转换有一个或两个stage VMSAv8-32 由运行AArch32的异常级别来管理 VMS ...
- CONFIG_DEBUG_USER【转】
转自:https://blog.csdn.net/adaptiver/article/details/12778621 关于CONFIG_DEBUG_USER 把menuconfig中查到的 CONF ...
- Linux 获取设备树源文件(DTS)里描述的资源【转】
转自:http://www.linuxidc.com/Linux/2013-07/86839.htm 转自:http://blog.sina.com.cn/s/blog_636a55070101mce ...
- 解决Android SDK下载和更新失败问题
今天更新sdk报错如下: Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml. 说dl- ...
- java 格式化
一. 可以之际像c语言一样用System.out.printf()格式化输出 二. System.out.format 1. format()方法模仿自printf(), 可用于PrintStream ...
- poj3667 区间合并,找最左边的空余块
题很简单:给两个操作1:查找最左边的a个空余块并填满 2:把从第a个开始的连续b个块置空 线段树维护左连续,右连续,最大连续,lazy-tag即可,query函数值得学习 #include<io ...
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...
- 彻底解决:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
转载:https://blog.csdn.net/qq_31122833/article/details/83992085
- Ubuntu 16.04 LTS 搭建ftp服务器
其实我之前搭建好了,但是最近我上来看好像跟没搭建一样呢,于是我从新搭建一遍? 我的ubuntu版本: cat /etc/issue Ubuntu 16.04 LTS \n \l 1.安装vsftpd( ...