[SDOI2005]反素数ant
题目描述
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
输入输出格式
输入格式:一个数N(1<=N<=2,000,000,000)。
输出格式:不超过N的最大的反质数。
输入输出样例
输入样例#1:
1000
输出样例#1:
840
数学题
打个表就可以发现、
1 1 2 1*2
4 2*2
6 2*3
12 4*3
24 12*2
36 12*3
48 24*2
60 12*5
120 24*5
180 60*3
剩下的就是简单的dfs了
240 120*2
360 180*2
720 360*2
840 120*7
1260 180*7
1680 840*2
2520 360*7
5040 2520*2
7560 2520*3
10080 5040*2
15120 5040*3
开始看错题目写的递推水了20分后来看了题解发现当有多组解时求最小值
每一个反质数都是某一个已求出的反质数与一个质数的乘积
#include<cstdio> typedef long long LL; int prime[15] ={0,2,3,5,7,11,13,17,19,23,29,31,37,41}; int n; int ans,maxys=0; void dfs(LL now,int ys,int cnt) { if(ys>maxys||(ys==maxys&&now<ans) )ans=now,maxys=ys; if(cnt==14)return; LL a=1; for(int i=0;;i++) { if(a*now>n)break; dfs(now*a,ys*(i+1),cnt+1); a*=prime[cnt]; } } int main() { scanf("%d",&n); dfs(1,1,1); printf("%d",ans); return 0; }