【BZOJ 1053】[HAOI2007]反素数ant

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

用小的质数去凑那个数字。 显然比用大质数去凑划算。 因为 对于$x = p1^{q1}*p2^{q2}*...*pn^{qn}$ x的因子个数等于(q1+1)*(q2+1)....*(qn+1); 显然 你用的质数越小。 这个指数就能更大一点。 (表示相同的数字的情况下。至少不会更差。

根据这个。
又有235....2329>2*10^9
则只要考虑这10个质数就可以了。
枚举它们用了多少个。
(即枚举各个质数的指数
(找出最优解就好。

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int a[11] = {1,2,3,5,7,11,13,17,19,23,29};

LL n;
LL ansnum=-1,ansyueshu;

void dfs(LL cur,LL idx,LL cnt,LL yueshu){
    if (idx>10) return;
    //超过范围结束。

    //cur大于n了,那么结束
    if (cur>n) return;
    if (ansnum==-1){
        ansnum = cur;
        ansyueshu = yueshu;
    }else{
        if (yueshu>ansyueshu){
            ansnum = cur;
            ansyueshu = yueshu;
        }else if (yueshu==ansyueshu){
            if (cur<ansnum){
                ansnum = cur;
                ansyueshu = yueshu;
            }
        }
    }

    //还是选择这个数字继续乘。
    dfs(cur*a[idx],idx,cnt+1,yueshu/(cnt+1)*(cnt+2));

    //选择下一个数字乘。
    dfs(cur,idx+1,0,yueshu);
}

int main(){
	#ifdef LOCAL_DEFINE
	    freopen("rush_in.txt", "r", stdin);
	#endif
	scanf("%lld",&n);
    //当前数字,当前选择的是第几个数字,这个数字乘了几次,约数个数
    dfs(1,1,0,1);
    printf("%lld\n",ansnum);
	return 0;
}

posted @ 2018-03-10 21:53  AWCXV  阅读(130)  评论(0编辑  收藏  举报