首页 > 其他分享 >洛谷 UVA10852 Less Prime の 题解

洛谷 UVA10852 Less Prime の 题解

时间:2023-09-13 11:46:07浏览次数:52  
标签:Prime UVA10852 frac cdot 题解 int 素数 ans mx

这道题更像是结论题,因为他要推一个小结论,才能做出这道题。

大概思路是先打个素数表,存到数组 \(a\) 内, \(cnt\) 是素数表的最后一个元素的下标。之后循环 \(M\) 次去输入 \(N\),每次输入 \(N\) 之前都要定义两个变量,分别是 \(mx\),存 \(n - p \cdot x\) 的最大值,\(ans\) 则是当 \(n - p \cdot x\) 最大时存储 \(x\) 用的,之后开始循环,定义循环变量 \(j\),从 \(1\) 开始,循环至 \(cnt\),但是别忘了,我们还要设立一个循环边界,那就是 \(a_{j}\) 必须小于等于 \(N\),如果没有写上,答案肯定会错误。循环内只要写出 \(n - p \cdot x\) 的值是否大于 \(mx\),如果大于,则更新 \(mx\) 的值,并把 \(ans\) 设为目前的 \(x\)。等到循环结束后,则可以输出 \(ans\) 并换行。

之后我们来简化 \(n - p \cdot x\),其中 \(n\) 是我们变量里的 \(N\),\(x\) 是个素数,所以肯定是 \(a_{j}\),之后我们要用一个式子来表达 \(p\),如果能表达出来,这道题才有被解决的希望。

题目中给出了一个不显眼的式子,\(p \cdot a_{j} \le n < (p + 1) \cdot a_{j}\),你可能误认为这是一个数据范围,过滤掉了这个信息,但是我们却要用这个式子去推导 \(p\) 的表达式。下面我们就开始推导。

\(\because p \cdot a_{j} \le N < (p + 1) \cdot a_{j}\)

\(\therefore\frac{N}{a_{j}} - 1 < p \le \frac{N}{a_{j}}\)

\(\because p \in Z\)

\(\therefore p = \frac{N}{a_{j}}\)

这样,我们终于得出了结论,\(p = \frac{N}{a_{j}}\) 是恒成立的,我们把它代入到我们的代码中就可以得出正确结果了。

打素数表可以不用欧拉筛,因为这道题的数据范围不大,而且时限也放得比较宽,所以我们可以用暴力做法来存素数,我们只要打出前一万个素数就可以了。下面我们放出代码。

#include <iostream>
using namespace std;
int maxx = 10000, M, a[1000001], cnt = 0;
bool is_prime(int x){
    if(x == 1) return false;
    for(int i = 2; i * i <= x; i++) if(x % i == 0) return false;
    return true;
}
int main(){
    for(int i = 1; i <= maxx; i++) if(is_prime(i)) a[++cnt] = i;
    cin >> M;
    for(int i = 1; i <= M; i++){
        int N, mx = 0, ans = 0;
        cin >> N;
        for(int j = 1; j <= cnt && a[j] <= N; j++){
            if(N - (N / a[j]) * a[j] > mx){
                mx = N - (N / a[j]) * a[j];
                ans = a[j];
            }
        }
        cout << ans << endl;
    }
    return 0;
}

记录

标签:Prime,UVA10852,frac,cdot,题解,int,素数,ans,mx
From: https://www.cnblogs.com/NFGase/p/17699166.html

相关文章

  • 洛谷 UVA10714 Ants の 题解
    这道题只有一个点比较难想。大概思路就是先输入个$t$,表示要跑几轮,后面的照常输入。因为蚂蚁都是一样的,所以两个蚂蚁碰面的时候相互穿过和各自掉头是没有区别的,我们按照前者模拟就好,其余思路暴力求解即可。#include<iostream>#include<cmath>usingnamespacestd;intt;in......
  • 洛谷 AT_past202005_i 行列操作 の 题解
    这道题最难的点在于用什么方法存储矩阵$a$和一个特殊的操作方式。要存矩阵$a$,最先想到的是二维数组,但是二维数组开不到$1\len\le10^5$,所以可以用一个长度为$2\cdotn$的一维数组$m$来存。当$i\len$时,让一维数组$m_{i}$负责存第$i$行的内容;而当$n+1\lei......
  • 洛谷 AT_maximum_cup_2018_a フィギュアスケート界の貴公子埼大選手 の 题解
    这道题是一道水题,所以你的代码很可能与我相似或相同,如果你的代码出现了问题,你很可能在我的题解里找出答案。这道题大概思路是一旦$10$秒后运动员会接触到毛绒玩具,那么就加上在这个点上毛绒玩具的数量。但是!这道题有一道巨坑的点!由于这道题比较远古,所以说你即使是正解,你也要在......
  • 【题解】Educational Codeforces Round 141(CF1783)
    评价:educationalA.MakeitBeautiful题目描述:如果一个数组中存在一个数恰好等于该数前面所有数之和,那么这个数组就是丑的。如果一个数组不是丑的,就是美的。比如说:数组$[6,3,9,6]$是丑的,因为\(9=6+3\);数组$[5,5,7]$是丑的,因为第二个\(5=5\)。数组$......
  • 【题解】DP选练(23.9.11 - 23.9.12)
    一些写过题解的题我就直接挂连接了。[NOIP2018提高组]货币系统题目描述:在网友的国度中共有\(n\)种不同面额的货币,第\(i\)种货币的面额为\(a[i]\),你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为\(n\)、面额数组为\(a[1..n]\)的货币系统记作\((n,a)\)。......
  • [题解]AT_arc116_b [ARC116B] Products of Min-Max
    思路我们容易可以得到一个朴素的做法,首先对\(a\)数组排序,然后枚举最大值和最小值\(a_i,a_j\),那么对于中间的元素都有选与不选两种情况,得到答案:\[\sum_{i=1}^{n}(a_i\timesa_i+(\sum_{j=i+1}^{n}a_i\timesa_j\times2^{j-i-1}))\]然后对这个式子做一个化简:......
  • 【Flink系列十八】HDFS_DELEGATION_TOKEN过期的问题解决汇总
    问题类别Spark框架自身的问题Hadoop全家桶的问题开发者通过Hive,HDFS,HBASE访问HDFS的问题排查已知Hadoop-common-2.6.0的UGI存在bug,代码为HADOOP-10786,该问题在CDH发行版中已经修复,但Apache版本存在问题。已知HDFS也存在一个HDFS_DELEGATION_TOKEN过期的bug,代码为HDFS-9......
  • xilinx赛灵思下载器jtag-hs3兼容alinx仿真fpga烧录digilent高速常见问题解答
    1.概述  XJTAG-HS3是XILINX的USB转JTAG的高速仿真器,可以下载、烧录和仿真Xilinx FPGA和CPLD芯片,以及配置PROM、FLASH. XJTAG-HS3比PlatformCableUSBII下载器快10倍速度。 可以在30Mbit/秒下驱动JTAG/SPI总线,并且能实现对XilinxZYNQ平台处理器核的重置。可以支持ZYN......
  • C++ Primer 第一章:一些尝试和认识
    Warning以下是一些非常无聊的知识点,附以肤浅的理解和解释,仅供参考,切勿轻信。C++Primer1.4.4示例代码PS:这段代码没什么用。#include<iostream>intmain(){ intcurrVal=0,val=0; //接收输入流的第一个数 if(std::cin>>currVal){ intcnt=1; //......
  • P3616 富金森林公园 题解
    P3616富金森林公园题解题意给你\(n\)个点,有\(m\)次操作,每次操作可以改变一个数的值,也可以查询有多少连续的块,满足这个块内的所有数的值都大于查询的值。分析还是比较容易想到用数据结构或分块的,毕竟有同时存在修改和查询操作。但是维护什么?怎么维护?既然我们无法直接维......