首页 > 其他分享 >无序对的$gcd$

无序对的$gcd$

时间:2023-12-09 12:23:23浏览次数:25  
标签:gcd int 复杂度 无序 vector NlogN

\(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];

总时间复杂度:\(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];

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

两方法对比

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

例题

Counting Rhyme
Small GCD

标签:gcd,int,复杂度,无序,vector,NlogN
From: https://www.cnblogs.com/xiojoy/p/17890750.html

相关文章

  • CF1900D - Small GCD 题解
    1900D-SmallGCD给定序列\(A\),定义\(f(a,b,c)\)为\(a,b,c\)中最小的次小的数的\(\gcd\),求:\[\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^nf(a_i,a_j,a_k)\]题解目前来说有两种方法,都十分有启发意义,但是有共同的开头。考虑到\(A\)的顺序实际上没有......
  • Codeforces Round 911 (Div. 2) D. Small GCD
    题目链接:https://codeforces.com/contest/1900/problem/D对于已经排序好的数组\(a\),我们需要计算:\[\sum_{i=1}^n\sum_{j=i+1}^ngcd(a_i,a_j)*(n-j)\]由于\(\sum_{d|n}\phi(d)=n\),因此:\[\gcd(a_i,a_j)=\sum_{d|a_i,d|a_j}\psi(d)\]代入可得:\[\sum_{i=1}^n\su......
  • CF1900 D Small GCD 题解
    LinkCF1900DSmallGCDQuestion定义\(f(x,y,z)=\gcd(a,b)\),其中\(a,b\)为\(x,y,z\)中较小的那两个数给出数组\(a\),求\[\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n\sum\limits_{k=j+1}^nf(a_i,a_j,a_k)\]三个求和符号本质上就是选数组\(a\)中的三个数,也就是说,数......
  • D. Small GCD
    D.SmallGCDLet$a$,$b$,and$c$beintegers.Wedefinefunction$f(a,b,c)$asfollows:Orderthenumbers$a$,$b$,$c$insuchawaythat$a\leb\lec$.Thenreturn$\gcd(a,b)$,where$\gcd(a,b)$denotesthegreatestcommondivisor(GCD)ofi......
  • AtCoder Regular Contest 144 E GCD of Path Weights
    洛谷传送门AtCoder传送门喵喵题。考虑若所有点权都已确定,如何求\(1\)到\(n\)所有路径权值和的\(\gcd\)。考虑如何check一个\(x\)是否合法。\(x\)合法的充要条件是,把不能从\(1\)到达的点和不能到达\(n\)的点扔掉后,存在一组\(\{f_n\}\),使得对于每条\(u\tov\)......
  • ARC144E GCD of Path Weights
    Description给定\(n\)个点,\(m\)条边的有向图,图中的任意一条有向边满足边起点的编号小于边终点的编号。每个点有点权,但其中有些点的点权未知。你需要找到一种给未知点权值的方案,使得所有\(1\ton\)的路径点权和的最大公因数最大,或者告知答案可以无限大。输出这个最大值。......
  • playwright无序列表
    listitem是无序列表,ul和li标签组合•1.水平显示的列表•2.dropdown方式,一般需要鼠标悬停,出现对应的列表 1.#listitem定位,role角色定位到listitem上面在通过filter定位某一个文本page.get_by_role('listitem').filter(has_text='内容').click()2.#先定位点......
  • 牛客小白月赛81 F 小辰刚学gcd
    LInk首先我们可以注意到,两个数的gcd要不是它们当中较小的那一个要不是它本身。所以对于一个特定的\(r\),\(gcd_{i=p}^r,1<=p<=r\)来说,答案不会超过32种。并且因为gcd的性质,答案一定是成块且递减的。所以我们可以直接记录下对于每一个\(r\),答案都有哪些,从哪里开始出现。并......
  • [C#] 无序数组快速删除
    原文链接:https://dotnet9.com/2023/11/csharp-array-deletion-secret-quick-deletion-techniques-reveal-secrets-make-your-code-more-efficient将需要删除的元素和数组的最后一个元素进行交换。删除数组的最后一个元素。时间复杂度O(1)......
  • CGCDSSQ
    妙蛙种子。CGCDSSQ首先,如果一个数\(x\)的因数\(y\)要么是自己,要么\(y\le\frac{x}{2}\)。假设\(y\neqx\),\(y>\frac{x}{2}\)。\[\frac{x}{y}<2,y|x,\frac{x}{y}=1,x=y\]矛盾。懒得写了,看题解就想起来了……......