AcWing 220. 最大公约数 | 欧拉函数

传送门

题目描述

给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。

GCD(x,y)即求x,y的最大公约数。

输入格式

输入一个整数N

输出格式

输出一个整数,表示满足条件的数对数量。

数据范围

1≤N≤10^7

输入样例:

4

输出样例:

4

题解:本题要求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)数量,相当于求:对于N以内的每一个素数p,1<=x,y<=N/p 中GCD(x,y)为1的数对(x,y)数量和。我们知道欧拉函数的定义是1~n中与n互质的数的个数,那么对于p,1<=x,y<=N/p 中GCD(x,y)为1的数对(x,y)数量为φ(1)+φ(2)...+φ(N/p),可以用前缀和计算。要注意:x,y大小关系无影响所以要*2,但x,y相同时只算一次所以要-1。题目就变成了求\[\sum_{p是素数}^{p≤n} 2*\sum_{i=1}^{n/p}φ(i) -1\]  也可以用\[\sum_{p是素数}^{p≤n} 2*\sum_{i=2}^{n/p}φ(i) +1\]。

    

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e7 + 10;
int v[N],prime[N];
ll sum[N],phi[N];
int cnt = 0;
int main() {
    int n;
    scanf("%d",&n);
    phi[1]=1;
    for (int i = 2; i <= n; i++) {
        if(!v[i]) {
            v[i] = i;prime[cnt++] = i;
            phi[i] = i-1;
        }
        for (int j = 0; j < cnt; j++) {
            if (prime[j] > v[i] || prime[j] > n/i) break;
            v[i*prime[j]] = prime[j];
            phi[i*prime[j]] = phi[i] * (i%prime[j]?prime[j]-1:prime[j]);
        }
    }
    for (int i = 1; i <= n; i++)
        sum[i] = sum[i-1]+phi[i];
    ll ans = 0;
    for (int i = 0; i < cnt; i++) {
        int num = n/prime[i];
        ans += 2*sum[num]-1;
    }
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/l999q/p/11367956.html

时间: 2024-10-10 10:18:49

AcWing 220. 最大公约数 | 欧拉函数的相关文章

51nod 1040最大公约数和(欧拉函数)

1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) Output 公约数之和 Input示例 6 Output示例 15 思路: 目的是求∑(i= 1,n) gcd( i , n ): gcd(

BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i

HDU1695-GCD(数论-欧拉函数-容斥)

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5454    Accepted Submission(s): 1957 Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y

hdu1695--GCD(欧拉函数+容斥原理)

GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2015-01-07) Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. G

[bzoj 2818]欧拉函数

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 枚举最大公约数,对于每一个质数p,只需要求出1<=x,y<=(n/p)范围内gcd(x,y)=1的对数,而这个对数就是类似欧拉函数的一个前缀和. #include<cstdio> #include<cstring> using namespace std; const int maxn=10000005; bool check[maxn]; int pri

(hdu step 7.2.2)GCD Again(欧拉函数的简单应用——求[1,n)中与n不互质的元素的个数)

题目: GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 125 Accepted Submission(s): 84   Problem Description Do you have spent some time to think and try to solve those unsolved problem afte

欧拉函数的证明

首先,要知道欧拉函数是什么!!! 欧拉函数是小于n的数中与n互质(最大公约数为1)的数的数目: 然后,你需要想想 若n是质数p的k次幂, ,因为除了p的倍数外,其他数都跟n互质. 可得 若 则 代码: int phi(int n) { int i,rea=n; for(i=2;i*i<=n;i++) { if(n%i==0) { rea=rea-rea/i; while(n%i==0) n/=i; } } if(n>1) rea=rea-rea/n; return rea; } 番外:欧拉函数

找新朋友(欧拉函数)

找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8976    Accepted Submission(s): 4736传送门 Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的