题目传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237

数学题真是做的又爽又痛苦,爽在于只要推出来公式基本上就是AC,痛苦就在于推公式。。。

题意很简单,求

$\Large\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}gcd(i,j)$

其中$n\le 10^{10}$

这个题有很多做法,除了普及组的$O(n^2\log n)$做法,还有用莫比乌斯反演+分块优化的$O(n)$做法

然而因为这个题两个维度的限制是相等的,都是$n$,所以可以用杜教筛做到$O(n^{\frac{2}{3}})$

然后推一波公式

$\Large\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}gcd(i,j)$

按照套路,可以枚举最大公因数$g$,于是有

$\Large\sum\limits_{g=1}^{n}\sum\limits_{g=gcd(i,j)}g$

继续变形

$\Large\sum\limits_{g=1}^{n}g\cdot(\sum\limits_{g=gcd(i,j)}1)$

$\Large\sum\limits_{g=1}^{n}g\cdot(\sum\limits_{1=gcd(i,j)}^{i\le\lfloor\frac{n}{g}\rfloor,j\le\lfloor\frac{n}{g}\rfloor}1)$

到这里,我们就可以用莫比乌斯反演的套路做到$O(n)$的复杂度了,但是我们换种形式继续推式子

我们先关注这一部分的变形,暂时不管前面的那一部分

$\Large\sum\limits_{1=gcd(i,j)}^{i\le\lfloor\frac{n}{g}\rfloor,j\le\lfloor\frac{n}{g}\rfloor}1$

展开,得到

$\Large\sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{n}{g}\rfloor}[gcd(i,j)=1]\cdot 1$

其中$[gcd(i,j)=1]$的意思是,当$gcd(i,j)=1$的时候这个东西的值为$1$,否则为$0$

然后用$\varphi()$函数进行化简,于是式子就变成了

$\Large 2\cdot(\sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor}\varphi(i))-1$

注意到中间的一部分是$\varphi()$函数的前缀和,于是我们可以用杜教筛算

为了方便,设函数

$\Large S(n)=\sum\limits_{i=1}^{n}\varphi(i)$

然后再看一眼总的式子

$\Large\sum\limits_{g=1}^{n}g\cdot(2\cdot S(\lfloor\frac{n}{g}\rfloor)-1)$

于是$\lfloor\frac{n}{g}\rfloor$是整除,可以用分块优化,这样的话,除去杜教筛求$S()$的部分,复杂度是$O(n^{\frac{1}{2}})$

因为杜教筛有记忆化,复杂度和分块优化的部分是分离的,所以总复杂度是

$\Large O(n^{\frac{1}{2}}+n^{\frac{2}{3}})=O(n^{\frac{2}{3}})$

单点时限$5s$,我杜教筛记忆化用的$map$,没有自己手写$hash$,于是复杂度就多了$O(\log n)$,但是仍然每个点跑到了$1s$以内,还是挺不错的

上代码:

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <map> using namespace std;
typedef long long ll;
const int MOD = 1e9+;
const int LIMIT = ; bool vis[LIMIT] = {};
ll prime[LIMIT], pidx = , phi[LIMIT] = {}, pfphi[LIMIT] = {};
void prelude_phi() { // 线性筛预处理一部分前缀和
phi[] = ;
for( ll i = ; i < LIMIT; ++i ) {
if( !vis[i] ) {
prime[pidx++] = i;
phi[i] = i-;
}
for( int j = ; j < pidx; ++j ) {
ll k = i * prime[j];
if( k >= LIMIT ) break;
vis[k] = true;
if( i % prime[j] ) phi[k] = phi[i] * phi[prime[j]] % MOD;
else {
phi[k] = phi[i] * prime[j] % MOD;
break;
}
}
}
for( int i = ; i < LIMIT; ++i )
pfphi[i] = (pfphi[i-] + phi[i]) % MOD;
} ll inv2;
ll pow_mod( ll a, ll b ) {
if( !b ) return ;
ll rtn = pow_mod(a,b>>);
rtn = rtn * rtn % MOD;
if( b& ) rtn = rtn * a % MOD;
return rtn;
}
ll inv( ll x ) {
return pow_mod(x,MOD-);
} map<ll,ll> mp; // 记忆化用
ll S( ll n ) { // 杜教筛求前缀和
if( n < LIMIT ) return pfphi[n];
if( mp.count(n) ) return mp[n];
ll ans = (n % MOD) * ((n+) % MOD) % MOD * inv2 % MOD;
for( ll i = , j; i <= n; i = j+ ) {
j = n/(n/i);
ans = (ans - S(n/i) * ((j-i+) % MOD) % MOD + MOD) % MOD;
}
mp[n] = ans;
return ans;
} ll n; void solve() {
ll ans = ;
for( ll i = , j; i <= n; i = j+ ) {
j = n/(n/i); // 分块优化
ans = (ans + (((i+j) % MOD) * ((j-i+) % MOD) % MOD * inv2 % MOD) * (( * S(n/i) - ) % MOD) % MOD ) % MOD;
}
printf( "%lld\n", ans );
} int main() {
prelude_phi();
inv2 = inv();
scanf( "%lld", &n );
solve();
return ;
}

【题解】最大公约数之和 V3 51nod 1237 杜教筛的更多相关文章

  1. 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)

    题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...

  2. 51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛

    题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:虽然网上很多题解说用mu卡不过去,,,不过试了一下貌似时间还挺充足的,..也许有时间用phi ...

  3. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】

    首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...

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

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...

  5. 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

  6. 51nod 1237 最大公约数之和 V3(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...

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

  8. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  9. 51nod 1237 最大公约数之和 V3

    求∑1<=i<=n∑1<=j<=ngcd(i,j) % P P = 10^9 + 7 2 <= n <= 10^10 这道题,明显就是杜教筛 推一下公式: 利用∑d ...

随机推荐

  1. spark集群安装部署

    通过Ambari(HDP)或者Cloudera Management (CDH)等集群管理服务安装和部署在此不多介绍,只需要在界面直接操作和配置即可,本文主要通过原生安装,熟悉安装配置流程. 1.选取 ...

  2. jQuery 对象 与 原生 DOM 对象 相互转换

    区别 jQuery 选择器得到的 jQuery对象 和 原生JS 中的document.getElementById() document.querySelector取得的 DOM对象 是两种不同类型 ...

  3. UVa 340 - Master-Mind Hints 解题报告 - C语言

    1.题目大意 比较给定序列和用户猜想的序列,统计有多少数字位置正确(x),有多少数字在两个序列中都出现过(y)但位置不对. 2.思路 这题自己思考的思路跟书上给的思路差不多.第一个小问题——位置正确的 ...

  4. VBA基础之Excel VBA 表格的操作(一)

    一.Excel VBA 表格的操作1. Excel表格的指定以及表格属性的设置 Sub main() '把表格B2的值改为"VBA Range和Cells函数" Range(&qu ...

  5. NProgress.js加载进度插件的简单实用方法

    NProgress.js 说明: NProgress是基于jquery的,且版本要 >1.8 下载地址: https://github.com/rstacruz/nprogress API: N ...

  6. 拷贝构造函数 & 拷贝赋值运算符

    一.拷贝构造函数 1. 形式 class A { public: // ... A(const A &); // 拷贝构造函数 }; 2. 合成拷贝构造函数 编译器总会为我们合成一个拷贝构造函 ...

  7. 第四次作业之psp

    psp 进度条 博文字数累积折线图 代码行数累积折线图 psp饼状图

  8. 让我们一起来做最漂亮的Android界面吧!

    让我们一起来做最漂亮的Android界面吧! AndroidiOS产品设计 摘要:如何为Android设备量身定制以打造出最为完美的应用?这是让诸多开发者很是头疼的问题.不同于iOS,Android设 ...

  9. <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<二>

    <Item 9> Never call virtual functions during construction or destruction 1.you shouldn't call ...

  10. C# 执行bat文件

    private void RunBat(string batPath) { Process pro = new Process(); FileInfo file = new FileInfo(batP ...