[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; }