Topcoder SRM 661 (Div.1) 250 MissingLCM - 数论
【题意】
给你一个数N(1<=N<=10^6),要求最小的M(M>N),使得lcm(n+1,n+2,...m)=lcm(1,2,3,...,m)
【思路】
手速太慢啦,等敲完代码的时候发现比赛已经结束了
一开始我想直接枚举m,并判断lcm(1,..,m)与lcm(n+1,n+2,...,m)是否相等,但发现,当求到lcm(1,...,40)的时候就爆LL了
显然不能这样求
也就是说,要求出具体lcm(1,2,...,m)的值是很困难的
怎么求
可以把它分解质因数,分解成几个质数相乘的形式
判断lcm(1,...,m)和lcm(n+1,n+2,...,m)的质因数是否完全一样。
但是仅仅1~1000000的质数有8万个
枚举m再枚举质数显然吃不消。
然而我注意到有一条性质(不知道算不算)
假设有质数K,可以求出t,使得K的t次方刚好小于m(K^t<=m)
那么lcm(1,2,...,m)分解质因数中一定而且最多有t个质数K连乘,
这样就可以很快地吧lcm(1,2,...,m)分解质因数
那么怎么把lcm(n+1,n+2,...,m)分解质因数呢
仍然假设质数K,可以求出最大的t,以及一个常数c(1<=c<K),使得 n+1<=c*K^t<=m
那么lcm(n+1,n+2,...,m)分解质因数中一定而且最多有t个质数K连乘。
比如说质数3,n=16,m=22,可以求的c=2,t=2,即17<=2*3^2=18<=22,这样lcm(17,18,19,20,21,22)中最多有2个质数3连乘
既然知道怎么求lcm(n+1,n+2,..,m)和lcm(1,2,..,m)了
来探讨一下怎么求最小的m吧
我们想让这两个lcm分解质因数后完全一样,也就是说连乘的质数个数也完全相等。
也就是说,对于每个质数K都可以满足,存在c和最大的t 使得n+1<=c*K^t<=m
对于大于n小于m的质数,我们假设是P,那么一定n+1<=P<=m,一定可以满足条件
所以我们就只看小于等于n的质数就可以了
因为要使每个小于N的质数K,都存在c和最大的t 使得n+1<=c*K^t<=m,
我们枚举每一个质数,并求得c和t,使得刚好c*K^t>=n,
答案就取最大的c*K^t,即 max( c*K^t )
这样lcm(1,2,...,m)和lcm(n+1,n+2,...,m)的分解质因数后均至少有t个质数K。
如果最终m有 k^(t+1)<=m,那么这个K^(t+1)>n一定成立,故仍满足条件
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
using namespace std;
typedef long long LL;
LL i,j,k,n,m,x,y,T,big,cas,num;
bool flag; LL cur,ans; bool prim[];
LL ver[];
void GetPrim(LL size)
{
LL m=sqrt(size+0.5);
memset(prim,,sizeof(prim));//可以根据情况进行清空操作
num=;//把找到的质数存入ver数组中,num为ver数组的长度 //如果要获得质数数组,i就枚举到size,如果仅仅是prim数组,就枚举到m
for (LL i=;i<=size;i++)
{
if (!prim[i])
{
ver[++num]=i;
if (i<=m) for (LL j=i*i;j<=size;j+=i) prim[j]=;
}
}
} class MissingLCM
{
public:
int getMin(int N)
{
LL n=N;
GetPrim(n);
LL ans=n+;
for (i=num;i>=;i--)
{
LL u=ver[i];
for (j=;j*u<=n;j*=u); ans=max(ans,(n/j+)*j);
}
return ans;
}
};
Topcoder SRM 661 (Div.1) 250 MissingLCM - 数论的更多相关文章
- Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索
最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 【topcoder SRM 702 DIV 2 250】TestTaking
Problem Statement Recently, Alice had to take a test. The test consisted of a sequence of true/false ...
- TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E
传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...
- TopCoder SRM 667 Div.2题解
概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...
- 竞赛图的得分序列 (SRM 717 div 1 250)
SRM 717 DIV 1 中 出了这样一道题: 竞赛图就是把一个无向完全图的边定向后得到的有向图,得分序列就是每个点的出度构成的序列. 给出一个合法的竞赛图出度序列, 要求构造出原图(原题是求(u, ...
- [topcoder]SRM 646 DIV 2
第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...
- [topcoder]SRM 633 DIV 2
第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...
- Topcoder SRM 648 (div.2)
第一次做TC全部通过,截图纪念一下. 终于蓝了一次,也是TC上第一次变成蓝名,下次就要做Div.1了,希望div1不要挂零..._(:зゝ∠)_ A. KitayutaMart2 万年不变的水题. # ...
随机推荐
- js一些方法的扩展
//JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. //下面给出 ...
- 关于.NET的配置文件
无论是exe文件还是dll文件,都可以添加App.config文件,里面设置配置信息.比如<appSettings></appSettings>之间,可以加入Key-Value ...
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
- tyvj 1153 间谍网络 tarjan有向图强连通
P1153 - 间谍网络 From ForeverBell Normal (OI)总时限:13s 内存限制:128MB 代码长度限制:64KB 描述 Description 由于外国 ...
- Phonegap 3.0 拍照 出错的说明
在官方3.0 提供的摄像机操作例子是不成功的,因为该例子没有说明摄像机操作需要添加Plugin. 添加插件方法(安装cordova3.0时必须使用官方命令行方式,通过nodejs安装,且装上了git) ...
- codeforces C. Jzzhu and Chocolate
http://codeforces.com/contest/450/problem/C 题意:一个n×m的矩形,然后可以通过横着切竖着切,求切完k次之后最小矩形面积的最大值. 思路:设k1为横着切的次 ...
- c++ new带括号和不带括号
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说, ...
- Oracle RAC的五大优势及其劣势
Oracle RAC的五大优势及其劣势 不同的集群产品都有自己的特点,RAC的特点包括如下几点: 双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户 ...
- [LeetCode#265] Paint House II
Problem: There are a row of n houses, each house can be painted with one of the k colors. The cost o ...
- C/S结构与B/S结构的特点分析
C/S结构与B/S结构的特点分析 为了区别于传统的C/S模式,才特意将其称为B/S模式.认识到这些结构的特征,对于系统的选型而言是很关键的. 1.系统的性能 在系统的性能方面,B/S占有优势的是其异地 ...