t次詢問,每次給你乙個數n,求在[1,n]內約數個數最多的數的約數個數
第一行乙個正整數t之後t行,每行乙個正整數n
輸出t行,每行乙個整數,表示答案示例1
513911316
64166
對於100%的資料,t <= 500 , 1 <= n <= 1000000000000000000題意 :給你乙個 n ,詢問 從 1 到 n 約數個數最多的數的約數個數是幾個。
思路 :首先能想到的暴力肯定是不可解的, n 太大了
在數學上有乙個叫約數定理的東東,任意乙個數可以寫成一些質因子冪次的乘積,x = p1^a1*p2^a2*p3^a3 , 那麼約數的個數就等於(a1+1)*(a2+1)*(a3+1),
但是呢這個題不能去找每個數的質因數,會超時的,我們可以反著來,通過已知的質因子去尋找比 n 小的數,但是單純這樣還是會超時,我們來看乙個12 = 2^2*3 , 18 = 2*3^2 ,
這兩個數的約數個數是相同的,如果讓選的話優先會挑選小的那個數,觀察一下小的數會發現因子小的次冪是偏大的,那麼就可以貪心的選取了,下乙個數的次冪一定是小於等於當前數的次冪的。
**示例:
#define ll long longconst ll maxn = 1e6+5;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;
ll n;
ll a[35] = ;
ll ans;
void dfs(ll x, ll sum, ll k, ll ci)
}int main()
return 0;
}
在資料偏大的時候一定要想著可能會超 long long ,那麼這時候有些關係能用除解決,就盡量不要用乘的!!
約數的個數
輸入n個整數,依次輸出每個數的約數的個數。輸入的第一行為n,即陣列的個數 n 1000 接下來的1行包括n個整數,其中每個數的範圍為 1 num 1000000000 當n 0時輸入結束。可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的個數。6 1 4 6 8 10...
約數的個數
題目描述 輸入n個整數,依次輸出每個數的約數的個數。輸入描述 輸入的第一行為n,即陣列的個數 n 1000 接下來的1行包括n個整數,其中每個數的範圍為 1 num 1000000000 當n 0時輸入結束。輸出描述 可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的...
約數的個數
對於約數個數的求法,開始我的 是逐個列舉取餘,這當然是乙個很簡單易懂的方法。但是整個程式的時間複雜度達到o n m 對於超級大的測試樣例來說,這顯然不可取。cin n個整數,cout 每乙個整數的約數個數 include include using namespace std 求約數個數 int f...