[POI2002] 反素数

题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,求出不超过N的最大的反质数

求1~N最大反素数 即其1~N中约数个数最多的一个数最小

  • 1~N中任何数的不同质因子都不会超过3个,且其质因子的指数总和不会超过30

  • 反素数x的质因子是连续的若干个最小的质数,并且指数单调递减

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N=300+5,M=150+5,inf=0x3f3f3f3f,P=19650827;
    ll n,mx=0,ans=0;
    int p[20]={1,2,3,5,7,11,13,17,19,23,29,31,37};
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    void find(ll nw,int pos,int cnt,int lim){
    	if(cnt>mx||(cnt==mx&&nw<ans)) ans=nw,mx=cnt;
    	ll i=nw;int j=0;
    	while(j<lim){
    		++j;
    		if(n/i<p[pos]) break;
    		i*=p[pos];
    		if(i<=n) find(i,pos+1,cnt*(j+1),j);
    	}
    }
    
    int main(){
    //	freopen("in2.txt","r",stdin);
    	//freopen("xor.out","w",stdout);
    	rd(n);
    	find(1,1,1,30);
    	printf("%lld",ans);
    	return 0;
    }
    
posted @ 2019-08-23 15:37  委屈的咸鱼鱼鱼鱼  阅读(187)  评论(0编辑  收藏  举报