首页 > 其他分享 >CF1900 D Small GCD 题解

CF1900 D Small GCD 题解

时间:2023-11-27 19:22:24浏览次数:46  
标签:cnt ch gcd limits int 题解 sum CF1900 Small

Link

CF1900 D Small GCD

Question

定义 \(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}^n f(a_i,a_j,a_k) \]

三个求和符号本质上就是选数组 \(a\) 中的三个数,也就是说,数组的排列顺序其实是无关的,所以把数组 \(a\) 从小到大排序后再处理这个问题

排序后,\(a_k\) 肯定是最小的,所以答案就变成了

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

再优化以下式子,固定住 \(a_j\) 不动

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

我们单独看每一个 \(a_j\) ,设 \(x=a_j\) 问题就转化为求

\[\sum\limits_{i=1}^{j-1} \gcd(a_i,x) \]

考虑到 \(a_i\) 的范围特别小,可以枚举 \(x\) 的所有因子 \(y\) 计算 \(\gcd(x,a_i)=y\) 的 \(a_i\) 有多少个

定义 \(cnt_y\) 表示当前满足 \(a_i=y\) 的倍数 的 \(i\) 有多少个

例如 \(x=16,y=4\) 那么 \(a_i=4,8,12,16\) 满足

但是我们发现这样子会把 \(\gcd()=8,12,16\) 的都算进去,所以考虑容斥,需要减掉

例如 \(x=16,a_i=8\) 在 \(y=8\) 的时候算了一次,在 \(y=4\) 的时候又算了一次

定义 \(F_y\) 表示 \(\gcd(x,a_i)=y\) 的 \(a_i\) 的数量,有 \(F_y=cnt_y-\sum\limits_{k=2} F_{ky}\)

具体实现时,在每次计算出 \(F_y\) 后,对其因子减去其贡献

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}

const int maxn=1e5+5;
int N;
vector<int> factor[maxn];

void solve(){
    LL ans=0;
    N=read();
    vector<int> cnt(maxn+1);
    vector<LL> f(maxn+1);
    vector<int> a;
    for(int i=1;i<=N;i++) 
        a.push_back(read());
    sort(a.begin(),a.end());
    for(int i=0;i<N;i++){
        LL now=0;
        int x=a[i];
        for(int k=factor[x].size()-1;k>=0;k--){
            int t=factor[x][k];
            f[t]+=cnt[t];
            now+=t*f[t];
            for(auto tt:factor[t])
                f[tt]-=f[t];
        }
        for(auto t:factor[x]){
            cnt[t]+=1;
            f[t]=0;
        }
        ans+=now*(N-i-1);
    }
    cout<<ans<<'\n';
    return ;
}

int main(){
	cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    for(int i=1;i<maxn;i++)
        for(int j=i;j<maxn;j+=i)
            factor[j].push_back(i);
    int T=read();
    while(T--) solve();
}

标签:cnt,ch,gcd,limits,int,题解,sum,CF1900,Small
From: https://www.cnblogs.com/martian148/p/17860217.html

相关文章

  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......
  • P9447 [ICPC2021 WF] Spider Walk 题解
    更好的阅读体验很有意思的一道题。设\(f_i\)表示第\(i\)根线的答案,首先有一个关键结论:任意两根相邻的线答案只差一定小于\(1\)。原因显然,可以在无限远的地方加一根线来构造。该结论可以扩展一下,对于距离为\(d\)的两根线,答案之差不会超过\(d\)。考虑进行倒着加线,考虑加......
  • CF1900 C Anji's Binary Tree 题解
    LinkCF1900CAnji'sBinaryTreeQuestion给出一个树,每个节点上有一个字母L/R/U,从\(1\)号根节点开始,L表示接下来走到左节点,R表示接下来走到右节点,U表示接下载走到父节点问,最少修改几个节点上的字母使得从根节点走到叶子节点Solution定义\(F_x\)表示从\(x\)走到叶......
  • 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......
  • P7626 [COCI2011-2012#1] MATRIX( 普及/提高− ) 题解
    题目传送门思路:首先思考暴力,\(O(n^4)\)的时间复杂度,不行。那么我们这里就要运用到一点前缀和的知识了。我们可以用前缀和对两条对角线进行计数。每个点有两个对角线运算。差不多是\(O(n^2)\)到\(O(n^3)\)的时间复杂度。而\(n\leq400\)稳过。Code:#include<bits/stdc......
  • ORA-06502: PL/SQL: 数字或值错误:character string buffer too small
    原因是:DBMS_LOB.SUBSTR(CLOB)报错:超过缓存区长度解决办法:1、将自定义函数中的字符数参数设置为更大的数字(最大32767)。注意,这一设置和Oracle的版本有关系(Oracle10最大为4000,Oracle12可达32767)2、如果是拼接的字段来源是子表,那么就不在原sql中查对应字段,而是在后台JAVA中......
  • 复旦大学数学学院23级高等代数I期中考试精选大题解答
    四、求解下列线性方程组,其中$a_1,\cdots,a_n,b$为参数且$\sum\limits_{i=1}^na_i\neq0$:$$\begin{cases} (a_1+b)x_1+a_2x_2+a_3x_3+\cdots+a_nx_n=0,\\ a_1x_1+(a_2+b)x_2+a_3x_3+\cdots+a_nx_n=0,\\ a_1x_1+a_2x_2+(a_3+b)x_3+\cdots+a_nx_n=0,\\ \hfill\cdots\cdots......
  • CF1900 B Laura and Operations 题解
    LinkCF1900BLauraandOperationsQuestion给出\(1,2,3\)的个数\(a,b,c\)可以分别减少两个不同的数,增加一个与两个数都不同的数问,是否能经过一些操作使得就剩下\(1\)或\(2\)或\(3\)Solution先考虑\(1,2,3\)其实是等价的,所以我们只需要考虑把\(2,3\)全都变成......
  • CF1900 A Cover in Water 题解
    LinkCF1900ACoverinWaterQuestion给出一个\(n\)个格子,有些格子被堵塞了,有些格子是空的,我需要在进行一些操作,使得所有空的格子里面都有水操作1:给任意一个格子装上水操作2:把一格水从一个地方搬运到另外一个空的格子里如果一个空的格子的相邻的两个格子都有水,那么这......
  • Live Server插件打开浏览器时:该网页无法正常运作,127.0.0.1未发送任何数据的问题解决
    一、问题复现今天使用VsCode写HTML代码时,使用LiveServer打开预览时,发现浏览器显示“该网页无法正常运作,127.0.0.1未发送任何数据”的问题。二、解决办法1.在左侧工具栏找到扩展商店,找到LiveServer,然后点击对应的小齿轮,进入插件设置。2.选择ExtensionSettings3.进入......