传送门:点击打开链接
题意:把一个数的约数个数定义为该数的复杂程度,给出一个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; }