51NOD 1237 最大公约数之和 V3(杜教筛)

题意

求 $\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)$.

分析

$$\begin{aligned}
\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)  &= \sum_{i=1}^n \sum_{j=1}^n d[gcd(i, j)=d] \\
&= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n[gcd(i,j=d)] \\
&= \sum_{d=1}^n d \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu (i) \left \lfloor \frac{n}{id} \right \rfloor\left \lfloor \frac{n}{id} \right \rfloor \\
&= \sum_{T=1}^n ({\frac{n}{T}})^2 \sum_{d|T}d\mu (\frac{T}{d}) \\
&= \sum_{T=1}^n ({\frac{n}{T}})^2 \varphi (T)
\end{aligned}$$

使用了几个套路,

一是 $gcd(i,j)=d$ 的经典求和式子;

二是出现 $\sum_{d=1}^n d \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}$,枚举 $T=id$;

三是使用结论 $\mu * ID = \varphi$.

求欧拉函数的前缀和可以使用杜教筛。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000010;
typedef long long ll;
const ll mod = 1000000007;
const ll inv2 = (mod+1)>>1;
ll T, n, pri[maxn], tot, phi[maxn], sum_phi[maxn];
bool vis[maxn];
unordered_map<ll, ll> mp_phi;  //可换成unordered_map
ll S_phi(ll x) {
  if (x < maxn) return sum_phi[x];
  if (mp_phi[x]) return mp_phi[x];
  ll ret = (x%mod) * ((x+1)%mod) % mod * inv2 % mod;
  for (ll i = 2, j; i <= x; i = j + 1) {
    j = x / (x / i);
    ret =(ret - S_phi(x / i) * (j - i + 1) % mod + mod) % mod;
  }
  return mp_phi[x] = ret;
}
void initPhi()
{
  phi[1] = 1;
  for (int i = 2; i < maxn; i++) {
    if (!vis[i]) pri[++tot] = i, phi[i] = i-1;
    for (int j = 1; j <= tot && i * pri[j] < maxn; j++) {
      vis[i * pri[j]] = true;
      if (i % pri[j] == 0)
      {
          phi[i * pri[j]] = phi[i] * pri[j] % mod;
          break;
      }
      else
      {
          phi[i * pri[j]] = phi[i] * phi[pri[j]] % mod;
      }
    }
  }
  for (int i = 1; i < maxn; i++) sum_phi[i] = (sum_phi[i - 1] + phi[i]) % mod;
}

void solve()
{
    ll res = 0;
    for(ll i = 1, j;i <= n;i = j+1)
    {
        j = n / (n / i);
        ll tmp = (n/i) % mod;
        res = (res + tmp * tmp % mod * (S_phi(j)-S_phi(i-1) + mod) % mod) % mod;
    }
    printf("%lld\n", res);
}

int main() {
  initPhi();
  scanf("%lld", &n);
  solve();
  return 0;
}

参考链接:

1. http://www.ishenping.com/ArtInfo/1581096.html

2. https://oi-wiki.org/math/du/

原文地址:https://www.cnblogs.com/lfri/p/11701280.html

时间: 2024-10-09 23:34:07

51NOD 1237 最大公约数之和 V3(杜教筛)的相关文章

51Nod 1237 最大公约数之和 V3 杜教筛

题目链接http://www.51nod.com/Challenge/Problem.html#!#problemId=1237 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)$ ,$1\leq{n}\leq10^{10}$. 知识提要:$n=\sum_{d|n}\varphi(d)$ 该公式证明https://blog.csdn.net/chen1352/article/details/50695930 根据莫比乌斯反演可以得到 $\varphi(n)=\s

51nod 1220 约数之和(杜教筛 + 推推推推推公式)

题意 给出\(n(1\leq n \leq 10^9)\),求\(\sum_{i=1}^n\sum_{j=1}^n\sigma(ij)\),其中\(\sigma(n)\)表示\(n\)的约数之和. balabala 交了两道杜教筛的的板子题(51nod 1239, 1244)就看到了这题,然后不会搞,然后看题解看了一天一夜终于彻底搞明白一发A掉了...感觉学到了很多,写个博客整理一下,如有错请指出. 技能需求 数论函数与线性筛 莫比乌斯反演(也可以当成容斥去理解) 狄利克雷卷积 杜教筛 强大的数

【51Nod 1237】最大公约数之和 V3 莫比乌斯反演+杜教筛

题意 求$\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ 枚举约数 $$ \begin{align} ans &=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(i,j)=d] \ &=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[(i,j)=1] \ \end{align} $$ 利用

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

题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:因为是用的莫比乌斯函数求的,所以推导比大部分题解多...而且我写式子一般都比较详细,所以可能看上去很多式子,实际上是因为每一步都写了,几乎没有跳过的.所以应该都可以看懂的. 末尾的\(e\)函数是指的\(e[1] = 1\),\(e[x] = 0(x != 1)\)这样一个函数 \[\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\] \[\sum_{i

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \

51nod1237 最大公约数之和 V3

n<=1e10,问1<=i<=n,1<=j<=n,gcd(i,j)的和%1e9+7. QAQ自推的第一道,虽然很简单而且走了很多弯路而且推错了一次被ccz大爷调教,但还是挺感动的.. 其实在推数论之前可以先打个$\mu$和$\varphi $的表,推个两三步就验证一下,否则如果是大数论题,推错的后果是极其严重的. $\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ $=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(

【51nod】1238 最小公倍数之和 V3

[题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解] $ans=\sum_{i=1}^{n}\sum_{j=1}^{i}lcm(i,j)$ 令$g(n)=\sum_{i=1}\frac{n*i}{(n,i)}$,则要求g(n)的前缀和. $g(n)=n\sum_{d|n}\sum_{i=1}^{n}\frac{i}{d}[(n,i)=d]$ $g(n)=n\sum_{d|n}\sum_{i=1}^{n/d}i[(n/d,i)=1]$ $g(n

杜教筛 学习总结

看了看唐老师的blog,照猫画虎的做了几道题目,感觉对杜教筛有些感觉了 但是稍微有一点难度的题目还是做不出来,放假的时候争取都A掉(挖坑ing) 这篇文章以后等我A掉那些题目之后再UPD上去就好啦 由于懒得去写怎么用编辑器写公式,所以公式就准备直接copy唐老师的啦 首先积性函数和完全积性函数什么的就不再多说了 列举常见的积性函数: 1.约数个数函数和约数个数和函数 2.欧拉函数phi 3.莫比乌斯函数mu 4.元函数e 其中e(n)=[n==1] 5.恒等函数I 其中I(n)=1 6.单位函数

杜教筛 与 数论函数(狄雷克卷积)

为了改变数论只会GCD的尴尬局面,我们来开一波数论: 数论函数: 数论函数是定义域在正整数的函数. 积性函数: f(ab)=f(a)f(b),gcd(a,b)=1 ,完全积性函数: f(ab)=f(a)f(b) . 常见积性函数: φ(n) ,μ(n) (莫比乌斯函数), d(n) (因子个数), σ(n) (因子和). 单位函数 : e(n)=[n=1] . 常见完全积性函数: Idk(n)=n^k , 1(n)=Id0(n) , Id(n)=Id1(n) . 我们 有以下令人窒息的操作: (