码迷,mamicode.com
首页 > 其他好文 > 详细

[POI2002][HAOI2007]反素数(Antiprime)

时间:2019-04-05 12:15:11      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:main   ref   ==   最大   targe   tchar   int   stream   void   

题目链接

这道题需要用到整数唯一分解定理以及约数个数的计算公式。这里我就不再阐述了。

公式可以看出,只有指数影响约数个数,那么在唯一分解出的乘式中,指数放置的任何位置都是等价的。(即 23*34*57与27*34*53的约数个数相同)但很明显指数放置位置的不同会影响乘积的大小。由于所有比n小的数的约数个数都比他的约数个数小,换而言之就是约数个数不相等。即 相同约数个数,该数越小越好。那么我们运用贪心思想。尽量大的指数放置于尽量小的底数上。

题目的数据范围小于231,所以指数最大31,由之前的推论,若底数递增,则有指数递减。直接dfs。减一下枝,质因数最多只有十个,这题就十分简单了。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll read(){
    ll res=0,f=1;
    char ch=getchar();
    while(ch<0||ch>9){
        if(ch==-)f=-1;
        ch=getchar();
    }
    while(ch>=0&&ch<=9){
        res=res*10+(ch-0);
        ch=getchar();
    }
    return res*f;
}
int p[20]={0,2,3,5,7,11,13,17,19,23,29};
ll n,s,s1;
void f(ll x,ll y,ll m,ll z){
    if(x>=11)return;
    ll k=1;
    for(int i=1;i<=m;++i){
        k*=p[x];
        if(y*k>n)return;
        if(z*(i+1)==s1&&y*k<s)s=y*k;
        if(z*(i+1)>s1)s=y*k,s1=z*(i+1);
        f(x+1,y*k,i,z*(i+1));
    }
}
int main(){
    n=read();
    f(1,1,31,1);
    cout<<s;
return 0;
}

 

[POI2002][HAOI2007]反素数(Antiprime)

标签:main   ref   ==   最大   targe   tchar   int   stream   void   

原文地址:https://www.cnblogs.com/clockwhite/p/10658337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!