首页 > 其他分享 >CF1575G GCD Festival 题解

CF1575G GCD Festival 题解

时间:2023-08-18 19:34:25浏览次数:35  
标签:std right limits Festival 题解 sum varphi CF1575G left

题意

给定一个长度为 \(n\) 的正整数数列 \(a\),求

\[\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{n} \gcd\left(a_i, a_j\right) \times \gcd\left(i, j\right) \]

(\(1 \le n,a_i \le 10^5\))。

题解

根据欧拉函数的性质,可以得出

\[n = \sum\limits_{d \mid n} \varphi(d) \]

该式也被称作欧拉反演。

下面开始化简算式

\[\begin{aligned} & \sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{n} \gcd\left(a_i, a_j\right) \times \gcd\left(i, j\right) \\ =& \sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{n} \gcd\left(a_i, a_j\right) \times \sum\limits_{d \mid \gcd\left(i, j\right)} \varphi(d) \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{n} \gcd\left(a_i, a_j\right) \left[d \mid \gcd\left(i, j\right)\right] \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{i = 1}^{n} \left[d \mid i\right]\sum\limits_{j = 1}^{n} \left[d \mid j\right]\gcd\left(a_i, a_j\right) \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j = 1}^{\lfloor\frac{n}{d}\rfloor} \gcd\left(a_{id}, a_{jd}\right) \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j = 1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{t \mid \gcd\left(a_{id}, a_{jd}\right)} \varphi(t) \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{t} \varphi(t) \sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j = 1}^{\lfloor\frac{n}{d}\rfloor}\left[t \mid \gcd\left(a_{id}, a_{jd}\right)\right] \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{t} \varphi(t) \sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\left[t \mid a_{id}\right]\sum\limits_{j = 1}^{\lfloor\frac{n}{d}\rfloor}\left[t \mid a_{jd}\right] \\ =& \sum\limits_{d = 1}^{n} \varphi(d) \sum\limits_{t} \varphi(t) \left(\sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\left[t \mid a_{id}\right]\right)^2 \\ \end{aligned}\]

我们先枚举 \(d\) 和 \(id\),复杂度为 \(\mathcal{O}(n \ln n)\)。如果我们在枚举 \(t\) 时可以保证只枚举 \(a_{id}\) 的因子,那么总复杂度为 \(\mathcal{O}(n \ln n \max\limits_{i = 1}^{n} d(a_i))\),其中 \(d(n) = \sum\limits_{i \mid n} 1\) 即 \(n\) 的约数个数,可以通过本题。

Code

//Codeforces - 1575G
#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;
typedef std::vector<bool> bitset;

constexpr valueType MOD = 1e9 + 7;

template<typename T1, typename T2, typename T3 = valueType>
void Inc(T1 &a, T2 b, const T3 &mod = MOD) {
    a = a + b;

    if (a >= mod)
        a -= mod;
}

template<typename T1, typename T2, typename T3 = valueType>
T1 mul(T1 a, T2 b, const T3 &mod = MOD) {
    return (long long) a * b % MOD;
}

class LineSieve {
public:
    typedef std::vector<valueType> container;

private:
    valueType size;
    bitset isPrime;
    container primeList, phi;
    ValueMatrix fact;

public:
    explicit LineSieve(valueType _size_) : size(_size_), isPrime(_size_ + 1, true), phi(_size_ + 1), fact(_size_ + 1) {
        phi[1] = 1;

        for (valueType i = 2; i <= size; ++i) {
            if (isPrime[i]) {
                primeList.push_back(i);
                phi[i] = i - 1;
            }

            for (auto const &iter: primeList) {
                valueType const t = i * iter;

                if (t > size)
                    break;

                isPrime[t] = false;

                if (i % iter == 0) {
                    phi[t] = phi[i] * iter;

                    break;
                } else {
                    phi[t] = phi[i] * (iter - 1);
                }
            }
        }

        for (valueType i = 1; i <= size; ++i) {
            for (valueType j = i; j <= size; j += i) {
                fact[j].push_back(i);
            }
        }
    }

    const container &Prime() const {
        return primeList;
    }

    valueType Phi(valueType x) const {
        if (x > size)
            throw std::range_error("Larger than Size.");

        if (x < 1)
            throw std::range_error("Too small.");

        return phi[x];
    }

    const container &Factor(valueType x) const {
        if (x > size)
            throw std::range_error("Larger than Size.");

        if (x < 1)
            throw std::range_error("Too small.");

        return fact[x];
    }
};

constexpr valueType V = 1e5 + 5;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    LineSieve const sieve(V);

    valueType N;

    std::cin >> N;

    ValueVector source(N + 1, 0);

    for (valueType i = 1; i <= N; ++i)
        std::cin >> source[i];

    valueType ans = 0;
    ValueVector count(V, 0);

    for (valueType d = 1; d <= N; ++d) {
        for (valueType i = d; i <= N; i += d)
            for (auto const &iter: sieve.Factor(source[i]))
                ++count[iter];

        valueType sum = 0;

        for (valueType i = d; i <= N; i += d) {
            for (auto const &iter: sieve.Factor(source[i])) {
                if (count[iter] > 0) {
                    Inc(sum, mul(mul(count[iter], count[iter]), sieve.Phi(iter)));

                    count[iter] = 0;
                }
            }
        }

        Inc(ans, mul(sum, sieve.Phi(d)));
    }

    std::cout << ans << std::endl;


    return 0;
}

标签:std,right,limits,Festival,题解,sum,varphi,CF1575G,left
From: https://www.cnblogs.com/User-Unauthorized/p/solution-CF1575G.html

相关文章

  • [AT_ABC106_C]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个字符串\(s\)以及一个整数\(k\)。该字符串为纯数字串。其中的数字\(x\)会在\(k\)天后变为\(x^{k-1}\)个\(x\)。求出\(10^{15}\)天后,串\(s\)的第\(k\)位是什么......
  • [AT_ABC106_D]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定正整数\(n,m,q\)。接下来给定\(m\)组\(x_i,y_i\),表示一列列车的起始站和终点站。在接下来给定\(q\)组\(l_i,r_i\)。对于每组询问,回答有多少\(x_i\geql_i\operatorna......
  • [AT_ABC106_B]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个正整数\(N\)。求出\(1\simN\)所有因数个数为\(8\)的数的个数。PartIIIAnalysis先输入\(N\)。遍历\(1\simN\)的每个数,记录每个数的因数个数。若因数个数等于\(8\)......
  • [AT_ABC106_A]题解(C++)
    PartIPreface原题目$\text{(Luogu)}$原题目$\text{(AtCoder)}$PartIISketch给定整数$a,b$,输出$(a-1)\times(b-1)$。$2\leqa,b\leq100$。PartIIIAnalysis运用小学知识,进行平移,把几块地拼接在一起。不难看出长为$a-1$,宽为$b-1$,面积为$(a-1)\tim......
  • [AGC061C] First Come First Serve 题解
    题意有两个长度为\(n\)的正整数列\(A,B\)。表示数\(i\)可以填到\(A_i\)或\(B_i\)两个位置中的一个。问删去空位之后可以形成的排列种数。(\(1\len\le5\times10^5\),\(A_i,B_i\)取遍\(\left[1,2n\right]\))。题解首先可以发现填数的方案数为\(2^n\),发现会计算......
  • 题解:【CF858E】 Tests Renumeration
    题目链接一点模拟下下火。首先一定不能覆盖的,只能一点一点挪。将已经在合法位置上的去掉,剩下的测试分为四类:不碍事的样例测试。不碍事的常规测试。占据了样例测试位置的常规测试。占据了常规测试位置的样例测试。将\(1\simn\)中还未使用的空闲位置记录下来,结论是只需......
  • Maui Blazor 安卓文字随系统文字缩放问题解决
    MauiBlazor的文字在正常情况下会随着用户手机内的系统文字设置大小而变化,所以可能导致手机应用内APP的布局由于文字变得过大或者过小而错乱。可以通过设置Webview里的文字缩放,保持应用内文字大小不变,代码如下:1.首先在Mainpage.xaml里设置好初始化事件,BlazorWebViewInitialize......
  • [AGC003F] Fraction of Fractal 题解
    一道很好的矩阵题,可以尝试作为矩阵转移的优质练习题。思路考虑由于黑点在原图中处于联通的状态。分三种情况讨论。上下左右联通。考虑这种情况下,不断分形后。最终产生的依然是一整个的大连通块。故,答案为一。上下左右都不连通。那么每一次分形后就会产生黑色点个连通......
  • 2023年 8月15日普及组南外集训题解
    A查找最大元素扫一遍确定最大值,如果是最大值输出字符和"(max)",不是的话只输出字符#include<iostream>#include<cstring>usingnamespacestd;charmaxx;strings;intmain(){cin>>s;for(inti=0;i<s.size();i++)if(s[i]>=maxx)......
  • Atcoder_[abc284E]Count Simple Paths题解
    题目链接这题就是很简单的图上深搜,我觉得放在E题太水了,代码里有详细注释。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvector<int>v[200010];//邻接表intans;//答案boolvis[200010];//vis[i]记录i号点有没有被访问过voiddfs(intx)......