反素数 51Nod1060 最复杂的数

传送门:点击打开链接

题意:把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。

思路:原来,这个叫反素数。

反素数的详细介绍看这里点击打开链接

有了反素数的性质,我们就能DFS搜了

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]";
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w+",stdout);
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MX = 1e2 + 5;
const int INF = 0x3f3f3f3f;

int ans;
LL id, n;
int prime[MX], psz, vis[MX];

void prime_init() {
    vis[1] = 1;
    for(int i = 2; i < MX; i++) {
        if(vis[i]) continue;
        prime[++psz] = i;
        for(int j = 2 * i; j < MX; j += i) vis[j] = 1;
    }
    psz = 17;
}
void DFS(LL s, int cnt, int p, int bo) {
    if(cnt > ans || (cnt == ans && s < id)) {
        ans = cnt; id = s;
    }
    for(int i = 1; i <= bo && (double)s * prime[p] <= n; i++) {
        s *= prime[p];
        DFS(s, cnt * (i + 1), p + 1, i);
    }
}
int main() {
    prime_init(); //FIN;
    int T; scanf("%d", &T);
    while(T--) {
        scanf("%I64d", &n);
        ans = id = 1;
        DFS(1, 1, 1, 100);
        printf("%I64d %d\n", id, ans);
    }
    return 0;
}


你可能感兴趣的:(反素数 51Nod1060 最复杂的数)