首页 > 其他分享 >Enumerating Rational Numbers 题解

Enumerating Rational Numbers 题解

时间:2024-03-30 16:58:38浏览次数:19  
标签:prime phi Enumerating 题解 long maxn Numbers 分母 欧拉

Enumerating Rational Numbers 题解

先下结论,这道题是一道欧拉函数板子题

观察题面可以发现,生成的分数有如下特性:

  • 分数都是最简分数
  • 分母与分子互质,且 分子 $ \le $ 分母
  • 当然第一个除外,那个特判即可,不用纳入考虑范围

我们知道,对于任意正整数 n ,欧拉函数,即 \(\varphi(n)\) 是小于 n 的正整数中与 n 互质的数的数目;此处分母与分子的关系与此相同,所以容易联想到,可以通过欧拉函数求第 \(k\) 个分数,即 \(\varphi(p)\) 的值代表以 p 为分母的最简分数的个数。

接下来考虑如何求出第 \(k\) 个分数的值,既然以每个正整数为分母的最简分数个数已经求出,结合数据范围,此处考虑二分查找,查找到第一个合适的作为分母,之后枚举分子并求解即可。

细节:

  • 根据样例可知,分母分子的最大值为 200000 ,所以数组仅需开到 200000
  • 0/1 的情况需要特判,因为这没有算进欧拉函数值中,求前缀和时也要 +1
  • gcd建议手写,变量建议全开 long long毕竟不开long long见祖宗

具体做法:

  1. 求出 1~200000 的欧拉函数值并求前缀和
  2. 进行一个二分,求出分母
  3. 循环枚举分子求解即可

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200005; 
long long prime[maxn],cnt,n=200005,phi[maxn]={0,2},sumphi[maxn]={0,1};
bool vis[maxn];
void f(){//欧拉筛求解欧拉函数
    for(int i=2;i<=maxn-5;i++){
	    if(vis[i]==0) prime[++cnt] = i, phi[i] = i-1;
	    for(int j=1;j<=cnt;j++){
	    	int tmp = i*prime[j];
	    	if(tmp>n)break;
    		vis[tmp] = 1;
    		if(i%prime[j]==0) { 
    			phi[tmp] = phi[i]*prime[j];
	    		break;
	    	}
    		else phi[tmp] = phi[i]*(prime[j]-1);
    	}
    } 
    for(int i=1;i<=maxn-4;i++){
        sumphi[i]=sumphi[i-1]+phi[i];
    }
    return;
}
long long gcd(long long a,long long b){
    if(a+b==1)return 1;   
    if(b){
        while((a%=b) && (b%=a));
    }
    return a+b;
}
void solve(long long x){
    if(x==1){
        printf("0/1\n");
        return;
    }
    int l=lower_bound(sumphi+1,sumphi+200001,x)-sumphi;
    x-=sumphi[l-1];//x用于统计答案分数前分数的个数(包括答案分数本身)
    for(long long i=1;i<=l-1;i++){
        if(gcd(i,l)==1)x--;
        if(x==0){
            printf("%lld/%lld\n",i,l);
            return;
        }
    }
    return;
}
int main(){
    f();
    while(1){
        long long c;
        cin>>c;
        if(c==0)break;
        solve(c);
    }
    return 0;
}
//from chpyx2

Written by ChpyX2

标签:prime,phi,Enumerating,题解,long,maxn,Numbers,分母,欧拉
From: https://www.cnblogs.com/ChpyX2/p/18105717

相关文章

  • 题解 CF698C【LRU】
    题解CF698C【LRU】题目描述有\(n\)种物品和大小为\(k\)的队列。每次操作,以\(p_i\)的概率选择第\(i\)种物品放入队尾,如果已经有物品\(i\)了就将物品\(i\)拿出来扔到队尾。若队列大小\(\gtk\),弹出队首。求\(10^{100}\)次操作后每种物品在队列里的概率。\(1\leq......
  • upload-labs简单题解
    upload-labs详解1-19关通关全解(最全最详细一看就会)-CSDN博客Upload-labs1-21关靶场通关笔记(含代码审计)_upload-labs21关-CSDN博客搭建upload-labs环境参考文章渗透测试——upload-labs环境部署_upload-loadsphpstudy-CSDN博客文件上传浅谈-CSDN博客 Pass-01考点:J......
  • 题解 ARC175C【Jumping Through Intervals】
    先不考虑构造字典序最小的方案,只考虑求出最小的\(\sum\limits_{i=1}^{N-1}|A_{i+1}-A_i|\)。设定义域为\([L_i,R_i]\)的函数\(F_i(x)\)表示考虑后缀\([i,N]\),令\(A_i=x\)时上式最小的值。初值为\(F_N(x)=0,(x\in[L_N,R_N])\)。显然有转移方程:\[F_i(x)=\min\limits_{y......
  • 题解 CF70E【Information Reform】
    题解CF70E【InformationReform】题目描述\(n\)个点的树,边权为\(1\)。可以花费常数\(k\),在一个点上建基站。每个点\(i\)需要找到离他最近的基站\(a_i\),花费\(d[dis(i,a_i)]\)。一种方案的总花费是建基站的花费加上每个点的花费之和。最小化总花费。输出方案\(a_i\)。......
  • ICPC2023 陕西邀请赛 题解
    G-PermutationQuestion找到一个排列\(p\),使得\(\prod_{i=1}^nlcm(p_i,p_{(imodn)+1})\)最大Solution考虑到\(x\)和\(x-1\)必然是互质的所以顺序排列即可Code#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;for(inti......
  • 快递员的烦恼【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-快递员的烦恼快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最短路径,告诉他最短路径的距离。注意:不限制快递包裹送到客户手中的顺序,但必须保证都送......
  • 园区参观路径【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-园区参观路径园区某部门举办了FamilyDay,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进;求从起始园区到终点园区会有多少条不同的参观路径;输入描述:第一行为园区长和宽;后面每一行表示......
  • [题解]P1439 【模板】最长公共子序列
    P1439【模板】最长公共子序列题意简述给出\(1,2,…,n\)的两个排列\(P_1\)和\(P_2\),求它们的最长公共子序列。范围限制:\(n\le10^5\)。样例53214512345输出:3。思路简述这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时......
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有......
  • 2024年03月CCF-GESP编程能力等级认证C++编程七级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题下列关于排序的说法,正确的是()。A.冒泡排序是最快的排序算法之一。B.快速排序通常是不稳定的。C.最差情况,N个元素做归并排序......