NYOJ_762:第k个互质数

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=762

直接给代码好了,容斥原理具体看《组合数学》

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

vector<int> a;    //存储n所有质因子
                //不爆int情况下,大概最多10个左右
int b[1010];

void getfac(int x)
{
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
        {
            a.push_back(i);
            while(x%i==0)
                x/=i;
        }
    if(x>1) a.push_back(x);
}
int cal(int x)    //由容斥原理计算1~x中有多少与n互质的自然数
{
    int g=0,ret=x;
    b[++g]=1;
    //由以下的二重for循环可以做到枚举组合,共2^(a.size())个组合
    for(int i=0;i<a.size();i++)
    {
        int t=g;
        for(int j=1;j<=g;j++)
            b[++t]=-b[j]*a[i],ret+=x/b[t];
        g=t;
    }
    return ret;
}
int work(int n,int k)    //二分查找
{
    int l=0,r=2e9;        //cal(l)<k,cal(r)>=k
    while(r-l>1)        //当r-l=1时,结束循环,此时cal(r)=k
    {
        int mid=l+(r-l)/2;
        if(cal(mid)<k) l=mid;
        else r=mid;
    }
    return r;
}

int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        a.clear();
        getfac(n);
        printf("%d\n",work(n,k));
    }
}
时间: 2024-08-29 18:03:14

NYOJ_762:第k个互质数的相关文章

第k个互质数(二分 + 容斥)

描述两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列. 输入 输入m ,k (1<=m<=1000000;1<=k<=100000000) 输出 输出第k个数. 样例输入 10 1 10 2 10 3 样例输出 1 3 7 首先对m进行质因数分解,求出m有哪些质因数,然后用容斥求[1, mid]内与m互质的数有多少个. 判断的时候,[1,mid]之间与m互质的数的数量 = mid - (包含一个质因子的数的个数)

hdu1695:数论+容斥

题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化为求区间 [1,b/k]和 [1,d/k]的互质数对个数 由于题目规定 (x,y)和(y,x)是同一种,所以我们可以规定 x<y,,然后只需对每一个y求出比他小的即可 公共部分可以通过欧拉函数快速求出.. 非公共部分就不行了.. 所以就分解质因数,用容斥的方法求了 #include <iostre

第六周周赛题解

A题 这题贼水,直接暴力就可以了. 用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段. 1 #include<stdio.h> 2 int n; 3 bool vis[100010]; 4 int main() 5 { 6 scanf("%d",&n); 7 int x; 8 int now=n; 9 for(int i=1;i<=n;++i) 10 { 11 scanf("%d",&x); 12 vis

融合后如何如何后如何如何

http://ypk.39.net/search/all?k=%A6%C6%B6%F5%D6%DD%C4%C4%C0%EF%C2%F2%C3%C0%C9%B3%CD%AAQ%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A1%C6 http://ypk.39.net/search/all?k=%A8z%BE%A3%C3%C5%C4%C4%C0%EF%C2%F2%C3%C0%C9%B3%CD%AAQ%A3%BA%A3%B8%

哥哥ukulele

http://ypk.39.net/search/all?k=%A1%FB%C6%CE%CC%EF%C4%C4%C0%EF%D3%D0%B0%B2%C0%D6%CB%C0%D2%A9%C2%F4Q%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A1%BC http://ypk.39.net/search/all?k=%A1%D3%B8%A3%C7%E5%C4%C4%C0%EF%D3%D0%B0%B2%C0%D6%CB%C0

HDOJ 3501 Calculation 2(欧拉函数拓展——求非互质数和)

Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2548    Accepted Submission(s): 1064 Problem Description Given a positive integer N, your task is to calculate the sum of the posit

poj 2773 利用欧拉函数求互质数

题意:找到与n互质的第 k个数 开始一看n是1e6 敲了个暴力结果tle了,后来发现k达到了 1e8 所以需要用到欧拉函数. 我们设小于n的 ,与n互质的数为  (a1,a2,a3.......a(phi(n))) 那么显然,在区间  [ k*n , (k+1)*n ]内的互质数即为 k*n+(a1,a2,a3.......a(phi(n))) 所以只需要求出 (a1,a2,a3.......a(phi(n))) 就可以利用欧拉函数快速找到后面的数 代码如下: #include <iostrea

51 nod 1105 第K大的数

1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合).求数组C中第K大的数. 例如:A:1 2 3,B:2 3 4.A与B组合成的C包括2 3 4 4 6 8 6 9 12共9个数. I

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插