51nod 1061 最複雜的數V2

2022-03-30 05:42:36 字數 1420 閱讀 7863

51nod 1061

求\([1, n]\)中約數個數最多的數。

\(n \le 10^\)

首先,答案一定是乙個反素數

什麼是反素數?

乙個正整數\(x\)是反素數的充要條件是:\([1, x - 1]\)中的整數的約數個數都小於\(x\)的約數個數。

反素數有什麼性質?

把乙個反素數分解成\(p_1^p_2^...p_n^\)的形式,則\(a_1 \ge a_2 \ge ... \ge a_n\)。

除\(1\)以外,乙個反素數\(x\)一定可以由乙個小於\(x\)的反素數乘上乙個質數得來。(證明大概比較顯然?感性理解一下 = =)

如果我們能求出\(10^\)以內所有反質數,詢問時直接lower_bound即可。

由此設計出演算法:

這樣就能求出\(10^\)以內所有反質數了(實際上只有3810個!)

這道題需要高精度,好在只需要高精度乘低精度即可。

#include #include #include #include #include #include #define space putchar(' ')

#define enter putchar('\n')

using namespace std;

typedef long long ll;

template void read(t &x)

template void write(t x)

const int n = 1000005, maxp = 100;

int t, prime[n], pcnt, tot;

bool np[n];

char s[256];

struct big

void out()

bool operator < (const big &b) const

bool operator > (const big &b) const

big operator * (ll x) const

} max, cur;

struct data

data(big x)

bool operator < (const data &b) const

data operator * (int p) const

} lst[4005];

priority_queue que;

void euler(int n)

}}int main()

}reverse(lst + 1, lst + tot + 1);

read(t);

while(t--)

return 0;

}

51nod 1061 最複雜的數 V2

我是榜上最後一名 可能高精度用vector太慢了吧 什麼破題 這道題很簡單,如果高精度熟練 也很簡單 然而,引數調了好久 我們發現質數的指數一定是,質數越小,指數越大,這個很顯然我不說了 所以我們就用個優先佇列bfs就好,佇列按數從小到大排序,每次把佇列的數取出來作為下乙個我們需要的數 也就是大小遞...

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。如果有多個...