hdu 5108 最小的M使N/M为素

来源:互联网 发布:中路火男打js好打吗 编辑:程序博客网 时间:2024/05/16 19:17

http://acm.hdu.edu.cn/showproblem.php?pid=5108

输入一个正整数N,然后求出一最小的正整数M使得 N/M 是一个素数

显然N/M应该是N的最大质因子,这样才能使得M最小。暴力找到最大质因子后用N除就能算出M了。
唯一无解的情况是N=1。

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <queue>#include <map>#include <iostream>#include <sstream>#include <algorithm>using namespace std;#define RD(x) scanf("%d",&x)#define RD2(x,y) scanf("%d%d",&x,&y)#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)#define clr0(x) memset(x,0,sizeof(x))#define clr1(x) memset(x,-1,sizeof(x))#define eps 1e-9const double pi = acos(-1.0);typedef long long LL;const int inf = 1000000000;const int maxn = 1e5+5;int p[maxn],pr[maxn],cnt;int init(){    clr0(p);    for(int i = 2;(LL)i * (LL)i <= inf;++i){        if(!p[i]){            for(int j = i + i;(LL)j * (LL)j <= inf;j += i)                p[j] = 1;        }    }    cnt = 0;    for(int i = 2;i * i <= inf;++i){        if(!p[i]){            pr[cnt++] = i;        }    }}bool isprime(int x){    for(int i = 2;i * i <= x;++i){        if(x%i == 0)            return false;    }    return true;}int work(int n){    int m = n;    if(n <= 1)        return 0;    for(int i = 2;i * i <= n;++i){        while(i*i <= n && n%i == 0)            n/=i;    }    return m/n;}int main(){    //init();    //cout<<cnt;    int n;    while(~RD(n)){        printf("%d\n",work(n));    }    return 0;}


0 0
原创粉丝点击