1060 最複雜的數

2021-08-14 05:07:07 字數 1826 閱讀 8216

把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1-n中複雜程度最高的那個數。

例如:12的約數為:1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。

input

第1行:乙個數t,表示後面用作輸入測試的數的數量。(1 <= t <= 100)

第2 - t + 1行:t個數,表示需要計算的n。(1 <= n <= 10^18)

output

共t行,每行2個數用空格分開,第1個數是答案,第2個數是約數的數量。
input示例

5110

1001000

10000

output示例

1 1

6 460 12

840 32

7560 64

題解:首先考慮約數。因為是約數,容易想到與素數,又因為每個數a =(p1^b1)*(p2^b2)*......(pn^bn)。所以乙個數的約數個數為(b1+1)*( b2 + 1)*......(bn+1)。然後又因為前16個素數的乘積大於1e18,故用搜尋,直接搜尋。當然這裡需要剪枝,因為考慮到約數個數盡量大而數的值盡量小,所以在相同約數個數情況下,較小的約數使用得多則數越小。即b1>=b2>=b3......>=bn。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairp;

const int inf = 0x3f3f3f3f;

const ll linf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double eps = 1e-10;

const int maxn = 1e5+7;

const int mod = 1e9+7;

int t;

ll n;

int p[16] = ;

ll ans1,ans2;

void dfs(ll now,ll cnt,int pos,int up)

}int main()

return 0;

}

涉及知識點:

反素數:對於任何正整數n,其約數個數記為f(n),例如f(6) = 4,如果某個正整數n滿足:對任意的正整數i(0

通俗的講,就是乙個數如果其約數個數大於小於它的所有數的約數個數,則這個數稱為反素數。

反素數的性質:

1、乙個反素數的所有質因子必然是從2開始的連續若干個質數,因為反素數是保證約數個數為x的這個數n盡量小。

2、同樣的道理,如果,n = (2^b1)*(3^b2)*(5^b3).....那麼必有b1>=b2>=b3>=......。

常見的有關問題有:

1、求約數為n的最小正整數x。

2、求n以內約數個數最多的較小正整數x。

這類問題多用搜尋解決,如果tle,考慮性質進行合理剪枝。

本題注意點:

if(now>n/p[pos]) break;

這個語句中的判斷語句如果改為now*p[pos]>n的話會錯,因為有可能乘法溢位。所以關於乘法,應該多注意,小心爆int,甚至longlong。

1060 最複雜的數 (反素數)

1060 最複雜的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最...

51Nod 1060 最複雜的數

把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 100 第2 t 1行 t個數...

51nod 1060 最複雜的數

1060 最複雜的數 ural 1748 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個...