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

CF1575G GCD Festival 题解

时间:2024-08-22 21:27:43浏览次数:6  
标签:lfloor gcd limits Festival 题解 sum varphi int CF1575G

考虑欧拉反演

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

则原式可以化为

\[\begin{align*} &\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(a_i, a_j) \cdot \gcd(i, j) \\ = &\sum\limits_{i = 1}^n \sum\limits_{j = 1}^n \gcd(a_i, a_j) \sum\limits_{d \mid \gcd(i, j)} \varphi(d) \\ = &\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(a_{id}, a_{jd}) \\ = &\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_{k \mid \gcd(a_{id}, a_{jd})} \varphi(k) \\ = &\sum\limits_{d = 1}^n \varphi(d) \sum\limits_{k = 1}^{\max\{ a \}} \varphi(k) \left( \sum\limits_{i = 1}^{\lfloor \frac n d \rfloor} [k \mid a_{id}] \right)^2 \\ \end{align*} \]

线性筛 \(\varphi\),预处理 \(a_{id}\) 的所有因数 \(k\)。枚举 \(d\) 和 \(i\),再枚举 \(id\) 的所有因数 \(k\) 计算答案。

时间复杂度 \(O(w + w \sqrt w + n \ln n \sqrt w)\),其中 \(w\) 是值域大小。可以通过。

#pragma GCC optimize("Ofast")

#include <iostream>
#include <map>
#include <vector>

#define int long long

using namespace std;

const int lim = 1e5;
const int mod = 1e9 + 7;

bool vis[lim + 5];
int pr[lim + 5], tail;
int phi[lim + 5];

int n;
int a[100005];
int cnt[100005];
vector<int> factor[100005];

signed main() {
#ifndef ONLINE_JUDGE
    freopen("CF1575G.in", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    phi[1] = 1;
    for (int i = 2; i <= lim; ++i) {
        if (!vis[i]) {
            pr[++tail] = i;
            phi[i] = i - 1;
        }
        for (int j = 1; j <= tail && i * pr[j] <= lim; ++j) {
            vis[i * pr[j]] = 1;
            if (i % pr[j] == 0) {
                phi[i * pr[j]] = phi[i] * pr[j];
                break;
            }
            phi[i * pr[j]] = phi[i] * phi[pr[j]];
        }
    }
    cin >> n;
    int mx = 0;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        mx = max(mx, a[i]);
    }
    for (int i = 1; i <= mx; ++i)
        for (int j = 1; j * j <= i; ++j)
            if (i % j == 0) {
                factor[i].push_back(j);
                if (j * j != i)
                    factor[i].push_back(i / j);
            }
    int ans = 0;
    for (int d = 1; d <= n; ++d) {
        for (int i = d; i <= n; i += d)
            for (auto fac : factor[a[i]])
                ++cnt[fac];
        for (int i = d; i <= n; i += d)
            for (auto fac : factor[a[i]])
                if (cnt[fac]) {
                    ans = (ans + phi[d] * phi[fac] % mod * cnt[fac] % mod * cnt[fac] % mod) % mod;
                    cnt[fac] = 0;
                }
    }
    cout << ans << endl;
    return 0;
}

标签:lfloor,gcd,limits,Festival,题解,sum,varphi,int,CF1575G
From: https://www.cnblogs.com/bluewindde/p/18374800

相关文章

  • CF163E e-Government 题解
    题目传送门前置知识AC自动机|树状数组解法一次性将所有模式串加入AC自动机,然后处理加入和删除,考虑单次操作对答案的贡献。因为模式串\(T\)在文本串\(S\)中出现的次数之和等价于\(T\)在\(S\)的所有前缀中作为后缀出现的次数之和。这就很和\(fail\)树上跳到根节......
  • [题解] permutation
    [题解]Permutation解析一眼DP或者组合。70pts场上推的DP对于\((4,2,2)\),先把所有序列枚举出来:\[\begin{split}1\\\2\\1\\\3\\1\\\4\\--\\2\\\3\\2\\\4\\3\\\4\end{split}\]可以发现,对于分割线上的部分,可以看作\((3,1,1)\)的所有序列......
  • csp模拟27-金箱子(题解)
    题目链接(显然还没有找到原题)虽说我现在才学会期望dp显得不太好,但没办法,谁让我比较菜~~,之前模拟赛已经考过几道类似的题了,但都一笔带过了,这次算是正式学习了一下这类题,于是就有了这篇题解。首先看到k次方首先想到的就是我们在进行dp转移的时候不太方便,这个时候很自然的想到二项......
  • 题解:P9041 [PA2021] Fiolki 2
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的DAG,定义\(f(l,r)\)表示最多选取多少条不相交路径\((s_i,t_i)\)满足\(s_i\in[1,k],t_i\in[l,r]\),其中不能有任意一点同时在两条选出的路径上。对\(\forallx\in[0,k)\)求出有多少\([l,r]\sube(k,n]\)使得\(f(l,r)......
  • 题解:P10881「KDOI-07」能量场
    \(\text{Link}\)题意给你一个长为\(n\)的序列\(a_{1\dotsn}\),定义一条边\((u,v)\)的权值为\(a_u+a_v\)。对于一张图,定义其权值为包含的所有边的权值乘积。求所有\(n\)个点的有标号基环树的权值之和。对\(998244353\)取模。\(n\le10^3\)。思路非常厉害的题,zky倾......
  • 题解:P10698 [SNCPC2024] 最大流
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的单位网络,保证该网络不存在环。给定一个常数\(k\),设从\(1\)到\(i\)的最大流为\(f_i\),对\(\foralli\in[2,n]\)求出\(\min(f_i,k)\)。\(n\le10^5\),\(m\le2\times10^5\),\(k\le\min(n-1,50)\)。思路不相交路径,考......
  • 升级Openssh 后 最大文件打开数修改不生效,启动 UsePAM yes后 ,最大文件打开数生效但是
    感谢 博主https://blog.csdn.net/Daphnisz/article/details/124040904vi /etc/pam.d/sshd(注意不是/etc/pam.d/sshd.pam)#%PAM-1.0auth required pam_sepermit.soauthsubstackpassword-authauthincludepostlogin#Usedwithpolkittoreauthor......
  • 常见问题解决 --- 为什么我们常常发现服务器没有管理的端口
    我们在扫描一台主机全端口,发现没有开放管理端口,比如windows远程桌面或者是linux的ssh登陆。我列举一下常见的原因。常规管理方式:1.管理口不是常见的3389和22端口,而改为了高位端口号,避免被人发现。2.在管理端口上加上了安全策略导致无法直接连接,比如私钥登陆方......
  • 题解:CF1986B Matrix Stabilization
    洛谷传送门题意一个\(n\timesm\)的矩阵,依次进行以下操作:从\((1,1)\)开始遍历矩阵,找到最小的\((i,j)\)满足\(a{i,j}\)的值严格大于其所有相邻(四联通)单元格的值,如果没有则退出将1操作找到的\(a_{i,j}-1\)返回1操作求最后的矩阵。思路模拟,我们按照题目所说,从......
  • 题解:P7020 [NWRRC2017] Boolean Satisfiability
    题目传送门题目大意给定一个由大小写字母(变量),|和~组成的布尔代数式,变量可以任意赋值为True或False。求对于给定的变量,有多少种赋值方案使得给定的代数式值为True。思路一个一个看,首先考虑|,先假设只有|,则当代数式中有一个变量为True时,代数式的值变为True。因为每一......