首页 > 其他分享 >洛谷 P2568 GCD

洛谷 P2568 GCD

时间:2023-10-22 19:27:10浏览次数:47  
标签:prime phi right 洛谷 GCD int sum P2568 left

题意:给定 \(n\) 求 \(\displaystyle{\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)\in prime\right]}}}\)

其中 \(prime\) 为素数集合。 \(n < 10^7\)

解:原式等于

\[\displaystyle{\sum_{p\in prime}\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)=p\right]}}} \]

这等于

\[\displaystyle{\sum_{p\in prime}\sum_{i=1}^{\lfloor \frac{n}{p}\rfloor}{\sum_{j=1}^{\lfloor \frac{n}{p}\rfloor}{\left[(i,j)=1\right]}}} \]

由于 \((i,j)\) 与 \((j, i)\) 都要被计入总数,我们可以这样

\[\displaystyle{\sum_{p\in prime}\left(\big(\sum_{i=1}^{\lfloor \frac{n}{p}\rfloor}{2\times\sum_{j=1}^{i}{\left[(i,j)=1\right]}\big)-1}\right)} \]

(这里减 \(1\) 是减到 \(i=j\) 的情况)

我们观察上面的式子,发现可以用 \(\phi\) 函数改写:

\[\displaystyle{\sum_{p\in prime}\left(2\times\sum_{i=1}^{\lfloor \frac{n}{p}\rfloor}{\phi(i)}-1\right)} \]

运用线性筛预处理 \(phi\) 前缀和即可做到 \(\mathcal{O(n)}\)

代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1e7 + 10;
int n;

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n;
    vector<int> prime(max(n + 1, (int)1e6));
    vector<bool> vis(n + 1);
    vector<LL> sum(n + 1);
    vector<int> phi(n + 1);
    int tot = 0;
    auto init = [&] {    
        vis[0] = vis[1] = 1;
        phi[1] = 1;
        for (int i = 2; i <= n; i++) {
            if (!vis[i]) prime[tot++] = i, phi[i] = i - 1;
            for (int j = 0; j < tot and prime[j] * i <= n; j++) {
                vis[prime[j] * i] = 1;
                if (i % prime[j] == 0) {
                    phi[i * prime[j]] = phi[i] * prime[j]; 
                    break;
                }
                phi[i * prime[j]] = phi[i] * (prime[j] - 1);
            }
        }

        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + phi[i];
        }
    };
    init();
    LL ans = 0;
    for (int i = 0; i < tot; i++) {
        ans += 2 * sum[n / prime[i]] - 1;
    }
    cout << ans << "\n";
    return 0;
}

标签:prime,phi,right,洛谷,GCD,int,sum,P2568,left
From: https://www.cnblogs.com/rhineofts/p/17780867.html

相关文章

  • KMP模板(洛谷P3375)
    1#include<bits/stdc++.h>2usingnamespacestd;3strings1,s2;4vector<int>find_next(vector<int>next,strings)5{6inti=1,prefix=0,len=s.length();7while(i<len)8{9if(s[prefix]=......
  • 【洛谷 9240】[蓝桥杯 2023 省 B] 冶炼金属
    #[蓝桥杯2023省B]冶炼金属##题目描述小蓝有一个神奇的炉子用于将普通金属O冶炼成为一种特殊金属X。这个炉子有一个称作转换率的属性$V$,$V$是一个正整数,这意味着消耗$V$个普通金属O恰好可以冶炼出一个特殊金属X,当普通金属O的数目不足$V$时,无法继续冶炼。现......
  • 洛谷P9752
    考场上暴力100题目传送门思路考虑到\(n\)很小,于是暴力,但不是枚举每个5位数再判断,而是把所有状态的可能正解用桶存个数,然后数量为\(n\)的就是一种方案代码#include<bits/stdc++.h>usingnamespacestd;constintMaxn=10;longlongn,a[Maxn][Maxn],cnt,vis[Max......
  • 【洛谷 8665】[蓝桥杯 2018 省 A] 航班时间
    #[蓝桥杯2018省A]航班时间##题目描述小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京......
  • 【洛谷 8772】[蓝桥杯 2022 省 A] 求和
    #[蓝桥杯2022省A]求和##题目描述给定$n$个整数$a_{1},a_{2},\cdots,a_{n}$,求它们两两相乘再相加的和,即$$S=a_{1}\cdota_{2}+a_{1}\cdota_{3}+\cdots+a_{1}\cdota_{n}+a_{2}\cdota_{3}+\cdots+a_{n-2}\cdota_{n-1}+a_{n-2}\cdota_{n}+a_{n-1}\cdota......
  • 【洛谷 8647】[蓝桥杯 2017 省 AB] 分巧克力
    #[蓝桥杯2017省AB]分巧克力##题目描述儿童节那天有$K$位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有$N$块巧克力,其中第$i$块是$H_i\timesW_i$的方格组成的长方形。为了公平起见,小明需要从这$N$块巧克力中切出$K$块巧克力分给小......
  • 【洛谷 8597】 [蓝桥杯 2013 省 B] 翻硬币
    #[蓝桥杯2013省B]翻硬币##题目背景小明正在玩一个“翻硬币”的游戏。##题目描述桌上放着排成一排的若干硬币。我们用`*`表示正面,用`o`表示反面(是小写字母,不是零),比如可能情形是`**oo***oooo`,如果同时翻转左边的两个硬币,则变为`oooo***oooo`。现在小明的问题是:如果......
  • 洛谷 P4749 [CERC2017] Kitchen Knobs 题解
    KitchenKnobs首先,一个trivial的想法是,因为每个旋钮如果上面的数字并非全部相同则其必有唯一最优位置,故直接扔掉那些全部相同的旋钮,对于剩余的求出其最优位置。明显此位置是一\(0\sim6\)的数。因为是区间同时旋转,所以转成数之后就是区间加同一个数。一个经典套路是差分。这......
  • 洛谷B2005 字符三角形(python)
    这题重点在如果输入print(a,a,a,a,a),逗号会使输出的时候五个字符之间有空格,应该用a+a+a+a+a。代码如下a=input();print(""+a)print(""+a+a+a)print(a+a+a+a+a) ......
  • 洛谷4363总结
    什么叫做博弈论DP呢?这里也是双方采取最佳策略,但是与普通博弈论不同的是,这里问的不是先手必胜or必败,而是问的最优值因此称作博弈论DP那么这种DP也是像SG游戏一样,我们想出博弈图然后倒推同时这题也是轮廓线DP,具体见这篇题解那么为什么菲菲要max,牛牛要min呢?我们就考虑dp数组的......