反素数 51Nod1060 最复杂的数

来源:互联网 发布:java项目遇到最大困难 编辑:程序博客网 时间:2024/06/05 15:40

传送门:点击打开链接

题意:把一个数的约数个数定义为该数的复杂程度,给出一个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;}


0 0