51nod-1434 区间LCM

来源:互联网 发布:有个卖时间的软件 编辑:程序博客网 时间:2024/06/07 22:52

思路:

找规律的时候发现最大的不超过2*最大的n。但是之后发现n=6时候m=10。

如果枚举1~5可以发现  2-2   3-3   4--2,2  5-5  6-2,3

那么必定是从5这个位置上决定的。因为6的2,3可以被2,3求最大公约数时合并到一起。

那么在求结果的时候,我们需要找到的东西就是无法被合并到一起的最大因子。而因子已经都已经被我们拆分为了素数。因此找最大的素数的幂就好了


#include <stdio.h>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;const int maxn=1000005;int prime[maxn],vis[maxn];int cnt=0;void init(){    for(int i=2; i<maxn; i++)    {        if(!vis[i])        {            prime[++cnt]=i;        }        for(int j=i; j<maxn; j+=i)        {            vis[j]=1;        }    }}int main(){    int t;    init();    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        int maxx=1;        int index=1;        for(int i=1; i<=cnt&&prime[i]<=n; i++)        {                int res=1;                int tmp=n;                while(tmp >=prime[i])                {                    res*=prime[i];                    tmp/=prime[i];                }                if(maxx<res)                {                    maxx=res;                    index=prime[i];                }        }        printf("%d\n",maxx*2);    }}


原创粉丝点击