[BZOJ1053][HAOI2007]反素数ant
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3444 Solved: 2014 [Submit][Status][Discuss]Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么
?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
要求的就是范围内最小的那个因数最多的数
对于一个整数$x$,可以唯一分解为 $x=p_{1}^{\alpha_{1}}*p_{2}^{\alpha_{2}}*\cdots*p_{n}^{\alpha_{n}}$ 的形式,其中$p$均为质数
那么它的因数个数为$(\alpha_{1}+1)*(\alpha_{2}+1)*\cdots*(\alpha_{n}+1)$,因为每个质数可以选择$\alpha+1$次,乘法原理
又因为要求的是最小,那么显然$p$是从$2$开始的连续质数,且$\alpha$单调不增,然后搜索即可
#include <iostream> using namespace std; typedef long long ll; ll pri[] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23}; int cnt[10] = {0}; ll n, ans = 2, ansnum; void work(int w, ll num, ll tot){ if(w > 9) return; if(tot > ans){ ans = tot; ansnum = num; } if(tot == ans && ansnum > num) ansnum = num; ll t = 1; for(int i = 1; i <= cnt[w - 1]; i++){ t *= pri[w]; if(num * t > n) return; cnt[w] = i; work(w + 1, num * t, tot * (i + 1)); } } int main(){ cin >> n; cnt[0] = 31; work(1, 1, 1); cout << ansnum << endl; return 0; }