51nod 1061
求\([1, n]\)中約數個數最多的數。首先,答案一定是乙個反素數。\(n \le 10^\)
什麼是反素數?如果我們能求出\(10^\)以內所有反質數,詢問時直接lower_bound即可。乙個正整數\(x\)是反素數的充要條件是:\([1, x - 1]\)中的整數的約數個數都小於\(x\)的約數個數。
反素數有什麼性質?
把乙個反素數分解成\(p_1^p_2^...p_n^\)的形式,則\(a_1 \ge a_2 \ge ... \ge a_n\)。
除\(1\)以外,乙個反素數\(x\)一定可以由乙個小於\(x\)的反素數乘上乙個質數得來。(證明大概比較顯然?感性理解一下 = =)
由此設計出演算法:
這樣就能求出\(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。如果有多個...