P8058 [BalkanOI2003] Farey 序列 题解
Solution
很多题解的的推导过程过于简单?
首先不难想到二分出第
定义
得到暴力方程:
正难则反:
套路地把
不难发现
带入原式得:
其实
所以
最终小于
将答案转化为分数只需要枚举分母即可。
时间复杂度为
#include<bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define il inline
#define debug() puts("-----")
using namespace std;
typedef pair<int,int> pii;
il int read(){
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
const int N=4e4+10;
const double eps=1e-10;
int n,k;
int f[N];
il bool check(double mid){
int cnt=0;
for(int i=1;i<=n;i++){
f[i]=(int)i*mid;
for(int j=2;j*j<=i;j++){
if(i%j==0){
f[i]-=f[j];
if(j*j!=i) f[i]-=f[i/j];
}
} cnt+=f[i];
} return (cnt<k);
}
signed main(){
n=read(),k=read();
double l=0,r=1,ans=0;
while(r-l>=eps){
double mid=(l+r)/2;
if(check(mid)) l=mid,ans=mid;
else r=mid;
} for(int i=1;i<=n;i++){
double x=(double)i*ans;
int j=ceil(x);
if(fabs((double)j/i-ans)<=eps){
printf("%d %d\n",j,i);
break;
}
} return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端