【数学】Codeforces Round #470 (Div2) B
题目链接:http://codeforces.com/contest/948/problem/B
题目大意:有一个大于等于3的数X0,任意选择一个小于X0的质数P0,乘以一个数k使k*P0>=X0,且(k-1)*P0<X0,令X1=k*P0,任意选择一个小于X1的质数P1,乘以一个数u使u*P1>=X1,且(u-1)*P1<X1,令X2=u*P1;现在给你X2,求出所有满足条件的X0里最小的那一个。
解题思路:
绕,超级绕。
我一开始读题目的时候就觉得这道题很绕完全搞不清楚大小关系,经过神级学长的耐心讲解终于搞懂了,此处%红太阳。
首先我想到的是暴力解法,枚举出所有的X1,再枚举出X1最大的质因数,X1-P+1的最小值即为解。于是我们来算一下时间复杂度。枚举所有的X1->O(n),枚举出X1最大的质因数->O(sqrt(n)),n的范围在1e6,果断T。
于是寻找更省时间的方法,不用枚举X1或者不用枚举X1的质因数。
我们探究一下X1和X2的关系,发现如果从X2着手,是可以确定X1的范围的。X2等于一个小于等于X1的质数乘以一个正数,不妨设这个质数为P,那么X2-P<X1<=X2,右区间是固定死了的X2,左区间的最小值在P取最大值的时候取到。所以X1的范围是[X2-X2最大的质因数+1,X2]。
似乎没有什么用,还是要枚举,但是如果我们已知了X0呢?
假设我们有一个满足条件的X0,一定可以找到一个X1>=X0且处于这个区间(因为保证了X0是满足条件的一个解)。这个X1是如何找到的?一个小于等于X0的质数乘以一个正数!也就是说,对于任意大于X0且小于等于X2的数X0',这个质数都存在,那么这个X1也存在,那么当X1>=X0'的时候,我们X0‘也是合理解,当X1<X0'的时候,X0’必定处于这个区间!(X1处于这个区间,X0'小于等于X2)。而处于这个区间的所有数都是一个满足条件的X0(可以取自己的质因数乘以一个因子等于自己,那么X0==X1,X1处于区间内)。
于是我们得出结论:只要一个X0是满足条件的解,所有大于X0且小于等于X2的都是满足条件的解。
满足单调性->求最小->二分!
最后只要二分X0即可。
下面放31msAC代码:
#include<stdio.h>
#define MAXN 1000000 int prime[MAXN+],tot;
bool f[MAXN+]; int _max(int a,int b){return a>b?a:b;} void _before(){ int i,j;
for(i=;i<=MAXN;i++){
if(!f[i])prime[++tot]=i;
for(j=;j<=tot&&prime[j]*i<=MAXN;j++){
f[i*prime[j]]=true;
if(i%prime[j]==)break;
}
}
} int main(){ int x1,x2,l,r,i,mid,p;
bool flag;
_before();
scanf("%d",&x2);
if(!f[x2]){
printf("%d",x2);
return ;
}
for(i=tot;i>=;i--)
if(x2%prime[i]==)break;
p=prime[i];
l=; r=x2;
while(l<r){
if(l+==r)break;
mid=(l+r)>>;
flag=false;
for(i=;prime[i]<=mid;i++){
x1=(_max(mid,x2-p+)+prime[i]-)/prime[i]*prime[i];//取大于左端点的最小的数
if(x1-prime[i]<mid&&x1<=x2){
flag=true;
break;
}
}
if(flag)r=mid;
else l=mid;
}
printf("%d",r);
return ;
}
【数学】Codeforces Round #470 (Div2) B的更多相关文章
- Codeforces Round #539 div2
Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...
- 【前行】◇第3站◇ Codeforces Round #512 Div2
[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- Codeforces Round #564(div2)
Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...
- 贪心/数学 Codeforces Round #212 (Div. 2) A. Two Semiknights Meet
题目传送门 /* 贪心/数学:还以为是BFS,其实x1 + 4 * k = x2, y1 + 4 * l = y2 */ #include <cstdio> #include <al ...
- 数学 Codeforces Round #219 (Div. 2) B. Making Sequences is Fun
题目传送门 /* 数学:这题一直WA在13组上,看了数据才知道是计算cost时超long long了 另外不足一个区间的直接计算个数就可以了 */ #include <cstdio> #i ...
- Codeforces Round #361 div2
ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...
- 数学 Codeforces Round #308 (Div. 2) B. Vanya and Books
题目传送门 /* 水题:求总数字个数,开long long竟然莫名其妙WA了几次,也没改啥又对了:) */ #include <cstdio> #include <iostream& ...
- Codeforces Round #626 Div2 D,E
比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...
随机推荐
- CodeBlocks调试器设置错误问题
错误如下: Building to ensure sources are up-to-date Selecting target: Debug ERROR: You need to specify ...
- 2017北京国庆刷题Day7 afternoon
期望得分:100+30+100=230 实际得分:60+30+100=190 排序去重 固定右端点,左端点单调不减 考场上用了二分,没去重,60 #include<cstdio> #inc ...
- Codeforces 807 C. Success Rate
http://codeforces.com/problemset/problem/807/C C. Success Rate time limit per test 2 seconds memory ...
- Intellij IDEA 快捷键整理(转)
Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...
- 在外网使用ssh连接内网中的多台Linux服务器
最近因为要对全球工控机网络进行协议扫描,需要在实验室配置几台服务器,因为我们只有一个IP地址,所以是用路由器搭建了一个内网(拓扑结构如下图).但是这样做了之后无法在宿舍通过ssh直接连接服务器,因为那 ...
- 【CodeForces】899 E. Segments Removal
[题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. ...
- iOS 程序启动流程
iOS程序启动原理 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong iOS应用程序运行 ...
- Spring Tool Suite 配置和使用
Spring Tool Suite使用 1.下载地址: http://spring.io/tools 2.配置字符编码:UTF-8 默认的编码是ISO-8859-1的西欧文字编 1.windows-- ...
- php上传文件大小限制的方法详解
打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就 ...
- itext 生成pdf文件添加页眉页脚
原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...