整除分塊是個啥:要求\(∑_^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\)
在每一段(l,r)中 k/i = k/l ,所以在相加的時候可以當作公因式提出來。\(∑_^ni\)相當於乙個等差數列。由等差數列求和公式可得: (r-l+1) * (l+r) / 2。\[∑_^n = ∑_^n = n * k - ∑_^n
\]
所以每一段(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 ...