zoukankan      html  css  js  c++  java
  • [POI2002][HAOI2007]反素数(Antiprime)

    题目链接

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

    公式可以看出,只有指数影响约数个数,那么在唯一分解出的乘式中,指数放置的任何位置都是等价的。(即 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;
    }
  • 相关阅读:
    04 SecurityContextHolder与SecurityContext说明
    03 spring security执行流程分析
    02 spring security 自定义用户认证流程
    01 spring security入门篇
    第三周进度
    第二周进度
    一维整数组所有子数组和的最大值
    初入园子,自我介绍
    密码登录源码(jsp+java+数据库)
    第一周总结
  • 原文地址:https://www.cnblogs.com/clockwhite/p/10658337.html
Copyright © 2011-2022 走看看