Small GCD

有两种做法

第一种做法:欧拉反演(其实我赛时的时候是想到了欧拉反演的,但是我不太清楚欧拉反演的使用trick)

欧拉反演的trick见这篇文章

欧拉反演直接用在gcd上还是挺多的(就像这篇文章中说的,gcd求和就可以用欧拉反演,实际上“龙哥的问题”就是典型的欧拉反演),可以想一下\(cnt\)数组怎么求

\(cnt\)数组其实是只用记一维的(因为记两维肯定爆炸了)。考虑对于\(d\),如果\(d\)不是\(a_i\)的约数,那么\(d\)\(i\)\(cnt\)\(d\)\(i-1\)\(cnt\)肯定是一样的;如果\(d\)\(a_i\)的约数,那么\(d\)\(i\)\(cnt\)就多了\(1\)

第二种做法:考虑贡献

见这篇文章

由于这道题目给的序列是离散的,我们没办法利用欧拉函数,所以考虑贡献的时候只能求出前面有多少个\(a_i\)满足gcd是\(x\),那么\(x\)肯定是\(a_i\)的约数,但是这样的\(a_i\)\(a_j\)的gcd却不一定是\(x\),但是我们有结论,公约数一定是gcd的约数,所以我们用容斥减去更大\(g\)就好了

posted @ 2024-03-07 21:01  最爱丁珰  阅读(4)  评论(0编辑  收藏  举报