1. 程式人生 > 其它 >反素數(用空多看一下)

反素數(用空多看一下)

技術標籤:程式碼應用

題目:https://www.acwing.com/problem/content/200/
對於任何正整數x,其約數的個數記作g(x),例如g(1)=1、g(6)=4。

如果某個正整數x滿足:對於任意的小於x的正整數 i,都有g(x)>g(i) ,則稱x為反素數。

例如,整數1,2,4,6等都是反素數。

現在給定一個數N,請求出不超過N的最大的反素數。

輸入格式
一個正整數N。

輸出格式
一個整數,表示不超過N的最大反素數。

資料範圍
1≤N≤2∗109

解析: 找一個數,滿足他的約數的個數是最多的,並且在約數個數相同的情況下,他是最小的(不然會存在跟他相等的約數但是比他小,這是不符合的)

通過 Dfs一個一個試所有情況。

每個數可以寫成:p1(c1的冪)* p2(c2的冪) ****** pr(cr的冪)
約數的個數: (c1 + 1) * (c2 + 1) * (c3 + 1)****** (cr + 1)
約數的和: 約數的和,在百度搜的
程式碼:

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e6 + 50;
const int INF = 0x3f3f3f3f;
typedef long long ll;

int n, ans, sum;
int prime[
] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; inline void Dfs(int u, int last, int p, int s) // (第幾個質數, 這個數的最大次冪, 這個數是多大, 約數的個數) { if (s > sum || (s == sum && p < ans)) { ans = p, sum = s; } for (int i = 1; i <= last; i++) { if ((ll)p * prime[u] > n) break;
p *= prime[u]; Dfs(u + 1, i, p, s * (i + 1)); } } int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n; Dfs(0, 30, 1, 1); cout << ans << endl; return 0; }