意:求$\sum_{i=1}^n \sum_{j=1}^n gcd(i,j),n<=1e10$


之前刚好在UVA上也做过一个这样求和的题目,不过那个数据范围比较小,一开始用类似的方法

$ans=\sum_{i=1}^n \sum_{j=1}^i gcd(i,j)-\sum_{i=1}^n i$

先考虑化简$\sum_{i=1}^n gcd(i,n)$变成好求和的形式

$$\begin{aligned} \sum_{i=1}^n gcd(i,n) &=\sum_{i=1}^n \sum_{d=1}^n d*[gcd(i,n)=d]\\ &=\sum_{d=1}^n d \sum_{i=1}^n [gcd(i,n)=d] \\ &=\sum_{d=1}^n d \sum_{\frac{i}{d}=1}^{\frac{n}{d}} [gcd(\frac{i}{d},\frac{n}{d})=1]\\ &=\sum_{d|n} d*\phi(\frac{n}{d}) \end{aligned}$$

发现是$f(n)=n$和$g(n)=\phi(n)$的卷积,令$S(n)$表示$g$的前缀和,然后非常套路地,然后刚刚那一坨的前缀和就变成求$\sum_{i=1}^n i*S(\lfloor \frac{n}{i} \rfloor)$,欧拉函数前缀和直接用杜教筛算,然后分块求和

一开始取模一直写挂…orz

(有点懒直接用map存了)

#include<cstdio>
#include<cstring>
#include<map>
using namespace std; typedef long long lint; const lint MOD=1000000007;
const lint N=4000005;
const lint G=100005; lint n,tot,inv2;
lint pri[N],phi[N];
bool p[N];
map<lint,lint>mp; inline void init()
{
p[1]=1;phi[1]=1;
for(register lint i=2;i<N;i++)
{
if(!p[i])
{
pri[++tot]=i;
phi[i]=i-1;
}
for(register lint j=1;j<=tot&&i*pri[j]<N;j++)
{
lint t=i*pri[j];p[t]=1;
if(i%pri[j]==0){phi[t]=phi[i]*pri[j];break;}
phi[t]=phi[i]*(pri[j]-1);
}
}
for(register lint i=1;i<N;i++)phi[i]=(phi[i]+phi[i-1])%MOD;
} inline lint pow_mod(lint a,lint b,lint p)
{
lint res=1;
for(;b;b>>=1,a=(a*a)%p)if(b&1)res=(res*a)%p;
return res%p;
} inline lint sum(lint x)
{
return x%MOD*((x+1)%MOD)%MOD*inv2%MOD;
} inline lint calc_phi(lint x)
{
if(x<N)return phi[x];
if(mp.count(x))return mp[x];
lint res=sum(x),pos;
for(register lint i=2;i<=x;i=pos+1)
{
pos=x/(x/i);
res-=((pos-i+1)%MOD*calc_phi(x/i)%MOD)%MOD;
res=(res%MOD+MOD)%MOD;
}return mp[x]=res;
} inline lint calc_ans(lint x)
{
lint res=0,pos;
for(register lint i=1;i<=x;i=pos+1)
{
pos=x/(x/i);
res+=(sum(pos)-sum(i-1))%MOD*calc_phi(x/i)%MOD;
res=(res%MOD+MOD)%MOD;
}return res;
} int main()
{
init();inv2=pow_mod(2,MOD-2,MOD);
scanf("%lld",&n);lint ans=calc_ans(n)%MOD;
ans=(ans*2)%MOD-sum(n);ans=(ans%MOD+MOD)%MOD;
printf("%lld",ans);
return 0;
}

[日常摸鱼]51nod1237-最大公约数之和V3-杜教筛的更多相关文章

  1. 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 ...

  2. 51nod 237 最大公约数之和 V3 杜教筛

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...

  3. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  4. 51 Nod 1238 最小公倍数之和 V3 杜教筛

    题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}l ...

  5. [51Nod1238]最小公倍数之和 V3[杜教筛]

    题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...

  6. 【51nod】1238 最小公倍数之和 V3 杜教筛

    [题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...

  7. 51nod 1244 莫比乌斯函数之和 【杜教筛】

    51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含 ...

  8. 51nod1237 最大公约数之和 V3

    题意:求 解: 最后一步转化是因为phi * I = Id,故Id * miu = phi 第二步是反演,中间省略了几步... 然后就这样A了......最终式子是个整除分块,后面用杜教筛求一下phi ...

  9. [51nod1237] 最大公约数之和 V3(杜教筛)

    题面 传送门 题解 我好像做过这题-- \[ \begin{align} ans &=\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\\ &=\sum_{d=1}^ ...

随机推荐

  1. 在FL Studio中如何制作和优化你的人声和弦(Vocal Chords)

    人声和弦在Future Bass.Melodic Dubstep等类型的电子音乐中被常用.与一般的和弦相同,其主要起到为主旋律做铺垫的效果,但是人声和弦加入了人声的因素,可以使得和弦更有趣,更有电子音 ...

  2. FL Studio通道常规设置

    每个通道设置窗口都包含声相.音量.音高和混音音轨等.刚学习FL Studio的同学可能对这些旋钮的功能还不是很了解,所以也就直接导致了不能很好的运用.为了帮助同学进一步熟悉这款软件,小编今天将为大家详 ...

  3. Flink-1-状态化流处理概述

    第1章 状态化流处理概述 参考书籍 Stream Processing with Apache Flinkhttps://www.oreilly.com/library/view/stream-pro ...

  4. C#设计模式-桥接模式(Bridge Pattern)

    引言 例如我有好几个项目,需要外包出去做各种类型的测试,不同的公司基础费用不同,不同的测试类型价格也是不同的.此时不同的项目选择不同的公司和不同类型的测试进行测试价格都是不同的.于是我们可以创建一个项 ...

  5. 【P2634】聪聪可可——点分治

    (题面来自Luogu) 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头 ...

  6. 配置Nginx 扩展实现图片剪裁

    在此之前需要安装ngx_http_image_filter_module,如果是采用的Docker的话可以看看我历史文章. 然后修改配置文件,增加几个location模块,配置如下,仅供参考 serv ...

  7. django(django学习) 两张表创建 插入数据

      pycharm中直接创建django项目 输入创建项目名(如first_django) 在此输入应用名(如g_tu) 此为项目总目录 将first_django中settings.py中第58行修 ...

  8. 关于esp8266的SDK开发串口打印mismatch map 3,spi_size_map 6 system_partition_table_regist fail解决办法

    最近在学习esp8266 用的sdk开发,烧录碰到个问题,本人使用的esp8266模块是esp8266-12f,模块是4M的也就是32Mbit 参考了网上的很多办法,大部分写的不清楚也没解决,摸索了几 ...

  9. moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...

  10. moviepy音视频剪辑:lum_contrast什么时候使用以及图像处理什么时候需要调整亮度与对比度

    ☞ ░ 前往老猿Python博文目录 ░ 一.亮度.对比度的概念 图像的亮度(luminosity )也即对明度的度量(参考<音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概 ...