Acwing 220 最大公约数

题意:

给定整数对N, 求1x,yN 且 gcd(x,y)为质数的数对(x,y)有多少对

思路:

枚举1pN所有质数p, gcd(x,y)=pgcd(xp,yp)=1,则统计1x,yNp内有多少个数对(x,y)满足gcd(x,y)=1即可

如何统计:对每个数x记录与其互质的数的数量(欧拉筛)并预处理欧拉函数的前缀和,枚举质数pans+=(sum[n/p]21)(其中sum[n/p]1x,yNp的欧拉函数前缀和,乘2是因为所得的所有(x,y)为一个解,(y,x)也是一个解。减1是因为当x=1时,y=1,则(x,y)(y,x)都为(11),会重复)

Code:

复制代码
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#include <map>
#include <set>
// #include <array>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
// #include <unordered_map>

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

#define Time (double)clock() / CLOCKS_PER_SEC

#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define slld(a) scanf("%lld", &a)
#define slldd(a, b) scanf("%lld%lld", &a, &b)

const int N = 1e7 + 20;
const int M = 1e6 + 20;
const int mod = 1e9 + 7;

int n, m;
ll sum[N];
bool st[N];
int primes[N], cnt, phi[N];

void get(int n){
    phi[1] = 1, sum[1] = 1;
    for(int i = 2; i <= n; i ++){
        if(!st[i]){
            primes[cnt ++] = i;
            phi[i] = i - 1;
        }
        sum[i] = sum[i - 1] + phi[i];
        for(int j = 0; primes[j] <= n / i; j ++){
            st[i * primes[j]] = true;
            if(i % primes[j] == 0){
                phi[i * primes[j]] = primes[j] * phi[i];
                break;
            }
            phi[i * primes[j]] = (primes[j] - 1) * phi[i];
        }
    }
}

void solve()
{
    sd(n);
    ll ans = 0;
    for(int i = 0; primes[i] <= n; i ++){
        ans +=  (sum[n / primes[i]] * 2 - 1);
    }
    cout << ans << endl;
    
}

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("/home/jungu/code/in.txt", "r", stdin);
    // freopen("/home/jungu/code/out.txt", "w", stdout);
#endif
    // ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    get(N - 20);
    // sd(T);
    while (T--)
    {
        solve();
    }

    return 0;
}
复制代码

 

posted @   君顾  阅读(143)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示