牛客 小G的約數引起的對於 整數分塊 學習

2022-06-12 13:33:17 字數 1111 閱讀 8522

整除分塊是個啥:要求\(∑_^n\) 的值,這時候暴力需要o(n)的時間。由於這個區間是連續的,且』/'是向下取整,當i不能整除k時,n/i會等於最小的i(也就是區間最左邊的值 l)除n的商。此時如果可以很快的找到這乙個區間,那麼就可以將時間複雜度降到\(o(\sqrt)\)。 接下來講一下怎麼去找這個區間:

假設n = 20,然後打表i1

2345

6789

1011

1213

1415

1617

1819

2020/i

201065

4322

2211

1111

1111

看到這個表不難發現規律,用20再去除以 (20/i) 就等於最後乙個等於這個值的數,比如說 當i=7時,20/i=2,那麼用20/(20/7) = 10, 這個時候10就是20/i等於2的最後乙個值。可以利用這個特性,在區間最左邊用o(1)的時間就可以計算出區間最右邊的座標。在這個區間內,所有的值都是相同的,所以找到這個區間後,直接用區間長度乘以單個數值就ok。

// core code

ll g(ll n)

return cnt;

}

next:餘數求和 要求\(∑_^n\)

\[∑_^n = ∑_^n = n * k - ∑_^n

\]

在每一段(l,r)中 k/i = k/l ,所以在相加的時候可以當作公因式提出來。\(∑_^ni\)相當於乙個等差數列。由等差數列求和公式可得: (r-l+1) * (l+r) / 2。

所以每一段(l,r)的和可以表示為 k/l * (r-l+1) * (l+r) / 2。

// riotian 21/03/03

#include using namespace std;

using ll = long long;

ll n, k, cnt;

int main()

cout << cnt << "\n";

return 0;

}

小G的約數

題意 題意 題意 小 g定 義了兩個 函式f n 為n 的約數和 小g定義了兩個函式f n 為n的約數和 小g定義了兩 個函式f n 為 n的約數 和 g n f 1 f 2 f n 1 f n 求g g n g n f 1 f 2 f n 1 f n 求g g n g n f 1 f 2 f n ...

牛客 n的約數(約數定理)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld t次詢問,每次給你乙個數n,求在 1,n 內約數個數最多的數的約數個數 第一行乙個正整數t 之後t行,每行乙個正整數n輸出t行,每行乙個整數,表示答案 示例1 51...

求約數的個數 牛客

輸入n個整數,依次輸出每個數的約數的個數 輸入的第一行為n,即陣列的個數 n 1000 接下來的1行包括n個整數,其中每個數的範圍為 1 num 1000000000 當n 0時輸入結束。可能有多組輸入資料,對於每組輸入資料,輸出n行,其中每一行對應上面的乙個數的約數的個數。示例1 5 1 3 4 ...