无序对的$GCD$
  tBVphSHF10WH 2023年12月09日 23 0

\(\sum_{i = 1}^n \sum_{j = i+1}^n GCD(a_i, a_j)\)

\(N\)为上确界,\(n\)\(a\)数组元素个数,\(D\)为约数个数。

方法一

\(1.\)求出\(d\)\(d[i]\)表示\(i\)的所有约数(有序)。

时间复杂度:\(O(NlogN)\)

vector<int> d[N + 1];
for (int i = 1; i <= N; i++)
    for (int j = i; j <= N; j += i)
        d[j].pb(i);

\(2.\)求出\(f\)\(f[i]\)表示满足\(gcd=ki\)的无序对的数量,\(k\in\mathbb{N^+}\)

在遍历到第\(j\)个数时,\(cnt[i]\)表示前\(j-1\)个数含有约数\(i\)的个数。

时间复杂度:\(O(nD)\)

vector<i64> f(N + 1);
vector<int> cnt(N + 1);
for (int j = 1; j <= n; j++)
    for (auto i : d[a[j]])
        f[i] += cnt[i]++;

\(3.\)容斥定理更新\(f\),此时\(f[i]\)表示满足\(gcd=i\)的无序对的数量。

时间复杂度:\(O(NlogN)\)

for (int i = N; i; i--)
    for (int j = 2 * i; j <= N; j += i)
        f[i] -= f[j];

\(4.\)\(ans\)\(ans\)即表示\(\sum_{i = 1}^n \sum_{j = i+1}^n GCD(a_i, a_j)\)

ans显然也可由\(\sum_{i = 1}^N f[i]\)表示,求和即可。

时间复杂度:\(O(N)\)

i64 ans = accumulate(f + 1, f + N + 1, 0LL);

总时间复杂度:\(O(NlogN+nD)\)

方法二

\(1.\)求出\(f\)\(f[i]\)表示满足\(gcd=ki\)的无序对的数量,\(k\in\mathbb{N^+}\)

时间复杂度:\(O(NlogN)\)

vector<i64> f(N + 1);
for (int i = 1; i <= n; i++) f[a[i]]++;
for (int i = 1; i <= N; i++)
    for (int j = 2 * i; j <= N; j += i)
        f[i] += f[j];

\(2.\)容斥定理更新\(f\),此时\(f[i]\)表示满足\(gcd=i\)的无序对的数量。

时间复杂度:\(O(NlogN)\)

for (int i = N; i; i--)
    for (int j = 2 * i; j <= N; j += i)
        f[i] -= f[j];

\(3.\)\(ans\)\(ans\)即表示\(\sum_{i = 1}^n \sum_{j = i+1}^n GCD(a_i, a_j)\)

ans显然也可由\(\sum_{i = 1}^N f[i]\)表示,求和即可。

时间复杂度:\(O(N)\)

i64 ans = accumulate(f + 1, f + N + 1, 0LL);

总时间复杂度:\(O(NlogN)\)

两方法对比

方法二时间复杂度更低,方法一能适用更多额外限制。

例题

Counting Rhyme
Small GCD

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月09日 0

暂无评论

推荐阅读
  jTMfQq5cr55P   2024年05月17日   44   0   0 算法与数据结构
  jTMfQq5cr55P   2024年05月17日   40   0   0 算法与数据结构
tBVphSHF10WH
作者其他文章 更多

2023-12-09