『JROI-4』分数
题面
点评
这是一道数论题。
40分
按照题意递推即可。时间复杂度 。
简要代码如下:
int nans=0;
void dfs(int fz,int fm,int ndeep){
if(fz==fm){
nans=max(nans,ndeep);
}
else{
fz++;
int tgcd = Gcd(fz,fm);
if(tgcd!=1){
fz/=tgcd;
fm/=tgcd;
}
dfs(fz,fm,ndeep+1);
}
}
70分
注:这是一个大的突破。
- 如果 是质数或 ,那么 。
很好理解,因为没有了约分。
- 如果 是 合数,那么 。
也很好理解,因为一旦有了约分,步骤就会被缩短。
所以我们可以从 开始从大到小暴力枚举质数。
时间复杂度不大好算(蒟蒻不会素数定理),但是比暴力好太多了。
简要代码如下:
int ans=0;
for(int i=n;i>=1;i--){
if(isprime(i)){
ans=i;
break;
}
}
100分
每一次都寻找太浪费了。我们可以用一个线性筛筛出所有的质数,然后再质数表上二分。
同样,对于 是质数,可以直接 得到 。
最差时间复杂度 。可以承受。
代码如下:
#include <bits/stdc++.h>
#define gcd __gcd
using namespace std;
int t;
struct LinearPrime{
const static int SIZE = 1e8+5;
bool isPrime[SIZE];
int Prime[SIZE];
int cnt=0;
void run(int n){
memset(isPrime,1,sizeof(isPrime));
isPrime[1]=false;
for(int i=2;i<=n;i++){
if(isPrime[i]){
Prime[++cnt]=i;
}
for(int j=1;j<=cnt&&i*Prime[j]<=n;j++){
isPrime[i*Prime[j]]=0;
if(i%Prime[j]==0){
break;
}
}
}
}
} Pri;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>t;
Pri.run(2e6+5);
while(t--){
int n;
cin>>n;
if(n==1){
cout<<1<<endl;
continue;
}
if(Pri.isPrime[n]){
cout<<n<<endl;
continue;
}
int pos=upper_bound(Pri.Prime+1,Pri.Prime+Pri.cnt,n)-Pri.Prime;
cout<<Pri.Prime[pos-1]<<endl;
}
return 0;
}
码风可能有点丑,敬请理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!