LOJ 6229 LCM / GCD (杜教筛+Moebius)

链接:

https://loj.ac/problem/6229

题意:

\[F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}\]

让你求 \(F(n) \bmod1000000007\)。

题解:

设\(\begin{align} f(n)=\sum_{i=1}^n\frac{lcm(i,n)}{gcd(i,n)}&=\sum_{i=1}^n\frac{n*i}{(i,n)^2}\\ &=\sum_{i=1}^n\sum_{d|n}[(i,n)=d]\frac{n*i}{d^2}\\ &=\sum_{d|n}\sum_{i=1}^{[\frac nd]}[(i,\frac nd)=1]\frac{n*i}d\\ &=\sum_{d|n}d\sum_{i=1}^d[(i,d)=1]*i\\ &=\frac 12(1+\sum_{d|n}d^2\varphi(d)) \end{align}\)。

即求 \(\sum_{i=1}^n\sum_{d|i}d^2\varphi(d)=\sum_{i=1}^n\sum_{d=1}^{[\frac ni]}d^2\varphi(d)\)。

令 \(\phi'(n)=\sum_{i=1}^ni^2\varphi(i)\)。

因为 \(\sum_{d|n}d^2\varphi(d)*(\frac nd)^2=n^2\sum_{d|n}\varphi(d)=n^3\)。

所以,

\(\begin{align} \sum_{i=1}^ni^3=[\frac{n(n+1)}{2}]^2&=\sum_{i=1}^n\sum_{d|i}d^2\varphi(d)*(\frac id)^2\\ &=\sum_{i=1}^ni^2\sum_{d=1}^{[ \frac ni]}d^2\varphi(d)\\ &=\sum_{i=1}^ni^2\phi'([\frac ni]) \end{align}\)。

所以得到:\(\phi'(n)=[\frac{n(n+1)}{2}]^2-\sum_{i=2}^ni^2\phi'([\frac ni])\)。

可以杜教筛先预处理前 \(n^{2/3}\),原问题可以在复杂度\(O(n^{2/3}log(n))\)内解决。

整合一下,就是:

推公式可以得到( 结合公式4 ):\(ans=\sum_{d=1}^n\sum_{i=1}^{\lfloor{n\over d}\rfloor}\sum_{j=1}^i ij[\gcd(i,j)=1]\)。

因为存在恒等式:\(\sum_{i=1}^ni[\gcd(i,n)=1]={[n=1]+n\varphi(n)\over 2}\)。

所以有:\(ans={n\over 2}+{1\over 2}\sum_{d=1}^n\sum_{i=1}^{\lfloor{n\over d}\rfloor}i^2\varphi(i)\)。

考虑 \(\sum_{i=1}^{n}i^2\varphi(i)\)出现的次数,可以得到: \(ans={n\over 2}+{1\over 2}\sum_{i=1}^ni^2\varphi(i)\lfloor{n\over i}\rfloor\)。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1e6+100;
const int mod = 1e9+7;
int n;
int p[maxn],phi[maxn],pre[maxn];

int inv2,inv6;
ll qpower(ll a,ll b,ll mod)
{
  ll res = 1;
  while(b>0) {
    if(b&1) res = res * a % mod;
    b >>= 1;
    a = a * a % mod;
  }
  return res;
}
void init(int n)
{
  phi[1]=1;
  for(int i=2;i<=n;i++)
  {
    if(p[i]==0) p[++*p]=i,phi[i]=i-1;
    for(int j=1;j<=*p && 1LL*p[j]*i<=n;j++)
    {
      p[p[j]*i]=1;
      if(i%p[j]) phi[i*p[j]]=phi[i]*phi[p[j]];
      else
      {
        phi[i*p[j]]=phi[i]*p[j];
        break;
      }
    }
  }
  for(int i=1;i<=n;i++) {
    pre[i]=(pre[i-1]+1LL*phi[i]*i%mod*i)%mod;
  }
}
map<ll,int> mp;
int calcinv2(ll l,ll r)
{
  l %= mod;
  r %= mod;
  return (r - l + 1) * (l + r) % mod * inv2 % mod;
}
int calcinv6(ll n)
{
  n %= mod;
  return n * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod;
}
int calc2(ll l,ll r)
{
 return (calcinv6(r) - calcinv6(l-1) ) % mod;
}
int calc3(ll n)
{
  return 1LL * calcinv2(1 , n) * calcinv2(1 , n) % mod;
}
int S(ll n)
{
  if(n <= 1e6) return pre[n];
  if(mp.count(n)) return mp[n];
  int res = calc3(n);
  for(ll i = 2, j; i <= n ;i = j + 1) {
    j = n / (n / i);
    res = (res - 1LL * calc2(i,j) * S(n / i)) % mod;
  }
  return mp[n] = res;
}
int main(int argc, char const *argv[]) {

  ll n;
  std::cin >> n;
  init(1000000);// 2/3
  inv2 = qpower(2,mod-2,mod);
  inv6 = qpower(6,mod-2,mod);
  int ans = 0;
  int last = 0;
  for(ll i = 1, j; i <= n; i = j + 1) {
    j = n /( n / i );
    int cur = S(j);
    ans = (ans + 1LL * (cur - last) * ( n / i)) % mod;
    last  = cur;
  }
  ans = (ans + n) % mod * inv2 % mod;
  std::cout << (ans + mod) % mod << '\n';
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  return 0;
}

原文地址:https://www.cnblogs.com/LzyRapx/p/8459266.html

时间: 2024-10-07 08:00:33

LOJ 6229 LCM / GCD (杜教筛+Moebius)的相关文章

loj#6229. 这是一道简单的数学题 (??反演+杜教筛)

题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}\),对1e9+7取模 推式子: \(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}\) \(=\sum_{i=1}^n\sum_{j=1}^i\frac{ij}{\gcd^2(i,j)}\) \(=\sum_{

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

[51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)

题意 求 $\sum_{i=a}^b \sum_{j=1}^i \frac{lcm(i,j)}{i}$. 分析 只需要求出前缀和, $$\begin{aligned}\sum_{i=1}^n \sum_{j=1}^i \frac{lcm(i,j)}{i} &= \sum_{i=1}^n \sum_{j=1}^i \frac{j}{gcd(i,j)} \\&= \sum_{d=1}^n \sum _{i=1}^n \sum_{j=1}^i \frac{j}{d} \cdot [gcd(i,j

【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} $$ 利用

【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\(gcd\)提出来 \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]\] 习惯性的提出来 \[\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)==1]\] 后面这玩意很明显的来一发

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

为了改变数论只会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) . 我们 有以下令人窒息的操作: (

【学术篇】分析矿洞 杜教筛

数论什么的都去死吧! 看着题解我都能化式子用完4页草纸... 另外吐槽一句出题人的拼音学的是真好, 不知道是不是故意的. 其实题解已经写得挺详细的了. 我就是提一些出题人觉得太easy没必要提但是做题还是需要的一些东西....(因为这些东西我基本都是现学的) 然而之前刚刚学完mobius反演就暂时性脱坑的我啥也不会啊.. 看到前排dp和曲神在水luogu的欢(bao/du)乐(ling/liu)赛, 就想去看看. 然后就点了报名但是发现自己什么都不会. 去看了看T1. 就是这道题. 然后成功的化

【XSY2721】求和 杜教筛

题目描述 设\(n=\prod a_i^{p_i}\),那么定义\(f_d(n)=\prod{(-1)^{p_i}[p_i\leq d]}\).特别的,\(f_1(n)=\mu(n)\). 给你\(n,k\),求 \[ \sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^kf_d(\gcd(i,j)) \] \(n\leq {10}^{10},k\leq 40\) 题解 先做一些简单的处理 \[ \begin{align} ans&=\sum_{i=1}^n\sum_{j=1}

BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 其中 表示ij的约数个数. 他发现答案有点大,只需要输出模1000000007的值. Input 第一行一个整数n. Output 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Ou