[日常摸鱼]51nod1237-最大公约数之和V3-杜教筛
题意:求$\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-杜教筛的更多相关文章
- 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 ...
- 51nod 237 最大公约数之和 V3 杜教筛
Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 51 Nod 1238 最小公倍数之和 V3 杜教筛
题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}l ...
- [51Nod1238]最小公倍数之和 V3[杜教筛]
题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...
- 【51nod】1238 最小公倍数之和 V3 杜教筛
[题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...
- 51nod 1244 莫比乌斯函数之和 【杜教筛】
51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含 ...
- 51nod1237 最大公约数之和 V3
题意:求 解: 最后一步转化是因为phi * I = Id,故Id * miu = phi 第二步是反演,中间省略了几步... 然后就这样A了......最终式子是个整除分块,后面用杜教筛求一下phi ...
- [51nod1237] 最大公约数之和 V3(杜教筛)
题面 传送门 题解 我好像做过这题-- \[ \begin{align} ans &=\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\\ &=\sum_{d=1}^ ...
随机推荐
- list scheduling algorithm 指令调度 —— 笔记
作者:Yaong 出处:https://www.cnblogs.com/yaongtime/articles/14033444.html 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同 ...
- ResNet模型
ReeNet论文地址:Deep Residual Learning for Image Recognition Resnet的两种不同结构 上图左边的结构主要是针对深度较少的网络,当深度较大时则用右边 ...
- 通过jquery 获取下拉列表中选中的值对应的value
<div class="col-sm-9"> <select id="device-type" class="form-contro ...
- 聊聊ReentrantLock实现原理
ReentrantLock 是常用的锁,相对于Synchronized ,lock锁更人性化,阅读性更强 从LOCK切入 考虑下面的场景如果有A,B线程,同时去执行lock.lock(Lock loc ...
- 口述完SpringMVC执行流程,面试官就让同事回家等消息了
Srping MVC 执行流程真的是老生常谈的话题了,最近同事小刚出去面试,前面面试官相继问了几个 Spring 相关的问题,但当面试官问他,你知道 Srping MVC 的执行流程吗?小刚娴熟的巴拉 ...
- 使用douban源下载python包
需求 python默认使用国外源下载依赖包,由于一些其它因素(例如网络差了,国外机器炸了,我们强大的祖国了...)经常导致下载安装失败,so出现了以豆瓣为主的国内下载源 如何使用豆瓣进行下载 豆瓣下载 ...
- PyQt(Python+Qt)学习随笔:键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Qt中的焦点有键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )的区分,键 ...
- PyQt学习随笔:Model和View之间的数据互动过程
在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeHint属性
在两种Spacer部件中都有sizeHint属性,在<PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸.minimumSizeHint建议最 ...
- RedHat-Linux操作指令第1篇
不同的linux系统切换方式会稍有一点差别 从图形界面切换到字符界面:Alt+F(1-8) 或者 Alt+Ctrl+Shift+F(1-8) 从字符界面切换回图形界面:Alt+F7 字符界面启动到图形 ...