window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://i.loli.net/2019/08/02/5d440029af8e994539.png" ], }

UVA10852 的题解

UVA10852 的题解

题目大意

给定自然数 \(n(100\leq n \leq 10000)\),寻找质数 \(x\le n\),使得 \(p\times x\leq n<(p+1)\times x\)\(n-p\times x\) 最大。

思路

不难发现,\(p\) 其实就是 $\left \lfloor \frac{n}{x} \right \rfloor $,所以,我们只要找到对应的 \(x\)\(p\) 的只就确定了。

那么如何求 \(x\) 的值呢?我们可以考虑枚举。

由于数据范围不大,\(O(n^2)\) 的时间复杂度可以通过此题,所以我们可以先预处理出 \(10000\) 以内的每一个质数,然后再预处理出对于每一个 \(n\)\(x\),查询时只需要输出就可以了。

Code

#include <bits/stdc++.h> #define fre(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) using namespace std; typedef long long ll; const int N = 1e4; const int INF = 0x3f3f3f3f; template<class _Tp> void read(_Tp &s) { s = 0; char ch = getchar(), last = ' '; while (ch < '0' || ch > '9') last = ch, ch = getchar(); while (ch >= '0' && ch <= '9') s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar(); if (last == '-') s = -s; } bool check_prime(int t) { int s = sqrt(t); for (int i = 2; i <= s; i++) if (t % i == 0) return 0; return 1; } int T; int n; int pri[N + 5], tot; int x[N + 5]; int main() { for (int i = 2; i <= N; i++) if (check_prime(i)) pri[++tot] = i; for (int i = 1; i <= N; i++) { x[i] = 1; for (int j = 1; j <= tot && pri[j] < i; j++) if (i - (i / pri[j]) * pri[j] > i - (i / x[i]) * x[i]) x[i] = pri[j]; } read(T); while (T--) { read(n); printf("%d\n", x[n]); } return 0; }

__EOF__

本文作者mgcjade
本文链接https://www.cnblogs.com/mgcjade/p/17992559.html
关于博主:蒟蒻一枚,I AK IOI!(不可能的)
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   mgcjade  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示