題目鏈結
無語。。。這題很迷啊,原諒我的菜,剛開始想用預處理尤拉篩和字首和,可是這題太血崩了,這樣一樣要遍歷,1-e9的範圍,後來翻網上題解,發現其實是個還算經典的問題
這題可以用離散和做嘛,如何離散和???先別著急,我們先想想,為啥這題不用尤拉函式做。。。
我們平時尤拉函式的題,都還能算比較難的題了,這題不僅僅加大了範圍,還要求1-n的因數個數,我們只有另尋其它方法
我們不如寫出1-10的因數組成(比賽一定要動筆啊)想是沒有用的。。。幹想沒有任何結果。。。
1----1
2----1 2
3----1 3
4----1 2 4
5----1 5
6----1 3 6
7----1 7
8----1 2 4 8
9----1 3 9
10---1 2 5 10
我們可以找一下規律,發現乙個還算奇特的現象,1-n的因數個數和可以寫成n/1+n/2+n/3+n/4-----n/n,如何解釋???其實很簡單,可以把這個式子看成1-n範圍
內的因數為 i 在1-n範圍內的個數,但是求這個式子,仍然是o(n)的操作,我們僅僅支援o(logn)的操作,我們發現,這是式子是個離散和,並轉化為面積,但是這個面積對稱,因此我們只需要算到乙個sqrt(n)就行,並把求的面積加二,但是面積是算重一部分(畫出來你就知道了)我們只需要減去就行
#include#include#include
#include
#include
#define ll long long
using
namespace
std;
intmain()
ans=ans*2
; ans=ans-mid*mid;
printf(
"%lld\n
",ans);
} return0;
}
牛客訓練賽25 A 最長區間
這題問最長的嚴格連續遞增序列的最長長度是多少?最開始感覺這道題不可做,因為有1e5個點,還有1e5的運算元 可是後來發現。這題水的一匹a i 和y都是在1 100的範圍內部 不如這樣,我用乙個d i 陣列記錄連續遞增的長度大小,用cnt i 陣列表示陣列裡面這個長度的連續遞增序列的個數,由於這個序列...
牛客練習賽25 A 因數個數和 數論分塊
題意 q次詢問,每次給乙個x,問1到x的因數個數的和。1 q 10 1 x 10 9 1s思路 對1 n中的每個數i,i作為i,2i,3i,的約數,一共作為n i個數的約數 於是題目就轉化為求 displaystyle sum n lfloor frac rfloor 數論分塊 o displays...
牛客練習賽25 因數個數和
大佬的部落格寫的很清楚 求1 n的因子個數和 就是從1 n中qu的數任意取乙個數i 在1 n之間有多少是i的倍數 即 n i 因為n i的結果也是 n的因數 所以可以只算 1 sqrt n 然後乘 2 因為n i可以等於i,乘2重複計算了,還要減去這些重複計算的數 只要 i的平方小於等於n 都算重複...