关闭

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

标签: 欧拉函数筛法
3106人阅读 评论(0) 收藏 举报
分类:

传送门
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,2)

1<=N<=10^7

Source

湖北省队互测

解题思路:
这个题是让求的<=n的GCD(x,y)==素数的个数(2,4)和(4,2)认为是不一样的,那么我们可以想到枚举每一个素数,让其GCD(x,y)=p,那么我们可以想到在[1,y/p]内与y/p互素的个数(在这里默认 y>x),那么我们就是求一个欧拉函数值,那么我们将其扩展到1-n区间内,就是求[1,n/p]的欧拉函数值,但是我们需要求的是sigmaEualr(n/p)的前缀和,因为y是从1-n之间取的,所以对数就是sum[n/p]*2-1,因为是对数,而且还有重复的情况(自身是素数的情况)

具体详见代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

typedef long long LL;
const LL MAXN = 1e7+5;
bool prime[MAXN];///标记数组是不是素数
LL phi[MAXN];///欧拉函数值,i的欧拉函数值=phi[i]
LL p[MAXN];///素因子的值
LL cnt = 0;
void get_Phi()///筛法求欧拉函数
{
    cnt = 0;
    memset(prime, true, sizeof(prime));
    phi[1] = 1;
    for(LL i=2; i<MAXN; i++)///线性筛法
    {
        if(prime[i])///素数
        {
            p[cnt++] = i;
            phi[i] = i-1;///素数的欧拉函数值是素数 - 1
        }
        for(LL j=0; j<cnt; j++)
        {
            if(i*p[j] > MAXN)
                break;
            prime[i*p[j]] = false;///素数的倍数,所以i*p[j]不是素数
            if(i%p[j] == 0)///性质:i mod p == 0, 那么 phi(i * p) == p * phi(i)
            {
                phi[i*p[j]] = p[j] * phi[i];
                break;
            }
            else
                phi[i*p[j]] = (p[j]-1) * phi[i];///i mod p != 0, 那么 phi(i * p) == phi(i) * (p-1)
        }
    }
}
LL sum[MAXN];///前缀和
void get_sum()
{
    memset(sum, 0, sizeof(sum));
    for(LL i=1; i<MAXN; i++)
        sum[i] = sum[i-1]+phi[i];
}
int main()
{
    get_Phi();
    get_sum();
    LL n;
    while(~scanf("%lld",&n))
    {
        LL ans = 0;
        for(LL i=0; i<cnt&&p[i]<=n; i++)
        {
            ans = ans+sum[n/p[i]]*2-1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

BZOJ 2818 Gcd(gcd(x,y)为素数/欧拉函数/莫比乌斯反演)

题目链接: BZOJ 2818 Gcd 题意: x∈[1,N],y∈[1,N],gcd(x,y)=素数的有序对(x,y)的对数。x\in [1,N],y\in [1, N],gcd(x,y)=素数的有序对(x,y)的对数。 分析: 对于一个素数p,如果gcd(x,y)=p,那么相当于x∈[...
  • Ramay7
  • Ramay7
  • 2016-06-04 14:55
  • 704

求一段区间内素数的个数

CSU1030: 素数槽 Description        处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽。例如,‹24, 25, 26, 27,28›是处于素...
  • zw1996
  • zw1996
  • 2016-03-24 16:57
  • 2126

hdu1695—GCD(求两个区间内互质的数的对数)

题目链接:传送门 GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11844 ...
  • jiangzhiyuan123
  • jiangzhiyuan123
  • 2017-08-01 10:19
  • 191

HDU 6069 数论 区间素数筛(+赛后反思

题目链接设 x=pa11pa22....pannx = p_1^{a_1}p_2^{a_2}....p_n^{a_n} 则d(x)=(1+a1)(1+a2)...(1+an)d(x) = (1+a_1)(1+a_2)...(1+a_n) d(xk)=(1+ka1)(1+ka2)(1+ka3).....
  • WuBaizhe
  • WuBaizhe
  • 2017-08-03 23:28
  • 315

java中判断任何一个整数区间的素数的个数,并输出所有的素数

什么是素数,这个概念还是初中接触的,看到这个题目还是百度了下,原来是大于1,,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数,,,,,, 看看在java中怎么编程来具体实现吧: package excise; import java.ut...
  • luoyexuge
  • luoyexuge
  • 2015-10-30 17:41
  • 1918

区间内素数的个数

给定整数a和b,请问区间[a,b)内有多少个素数? 限制条件:①a 输入:22  37 输出:3(23、23、31共3个素数) 输入:a=22801763489, b=22801787297 输出:1000 分析: b以内的合数的最小质因数一定...
  • jxust_tj
  • jxust_tj
  • 2015-02-10 15:29
  • 808

求解1-10000区间内的素数

转载自:http://blog.csdn.net/lxmky/article/details/7913885 问题: 求出所有1-MAX之间的素数分析: 我们知道如何判断一个数是否为素数,判断number是否可以被1到sqrt(num)之间数整除,如果存在被整除的,不是素数,否则就是素数。但是...
  • lime1991
  • lime1991
  • 2015-09-05 10:47
  • 347

【莫比乌斯反演-求序列中数字两两互质的对数】ACdreamoj Number theory 1114

Number theory Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Problem Description This time I will gi...
  • ydd97
  • ydd97
  • 2015-10-11 18:04
  • 774

spojD_query【主席树】统计区间内不重复数的个数

这个题加深了我对主席树的理解~题解的过程是扫描数列建立持久化线段树,若是第一次出现,就在该数位置加一;不是的话,上次出现的位置减一,新位置加一。对于每个询问区间[L,R]在第R个版本的线段树上只有前R个数,在线段树上查询位置L,对经过的区间进行累加。 这个做法我想了好久啊==为毛这么建树啊啊啊。举...
  • zhou_yujia
  • zhou_yujia
  • 2016-01-24 21:37
  • 759

[bzoj 1053] [HAOI2007]反素数ant:数论,DAG上最短路

题意:设g(i) = i的约数个数,若对于某个正整数x,所有0<i<x都有g(i)<g(x),那么称x为反素数。求不大于n的最大反素数。(n<=2*10^9) 暑假的时候TYQ同学提到一个有趣的概念叫做反素数,看到bzoj第一页有这道题,于是来写一写。 关于约数个数,我们知道...
  • ruoruo_cheng
  • ruoruo_cheng
  • 2016-12-04 14:52
  • 245
    个人资料
    • 访问:509489次
    • 积分:11349
    • 等级:
    • 排名:第1599名
    • 原创:639篇
    • 转载:5篇
    • 译文:0篇
    • 评论:93条
    博客专栏