題目描述
$\sigma_k(n) = \sum_ d ^ k$
求 $\sum_^n\sigma_k(i)$的值對 109
取模的結果。
輸入格式
第一行兩個正整數 n,k。
輸出格式
第一行輸出答案。
樣例輸入樣例
5 2
輸出樣例
63
資料範圍與提示
對於 100% 的資料,1≤n,k≤107
7 。
solution:
本題zyys。。。
直接列舉顯然不行,我們考慮改為求$n$的某一因子$d$在整個函式中的貢獻是多少。
套上數論分塊的思想,乙個因子$d$對式子的貢獻是$\lfloor}\rfloor\times d^k$。
這樣我們需要處理的就是$d^k$,直接$o(n\log k)$快速冪求出每個因子的冪是肯定不行的,因為$n$是$10^7$,直接會t。
那麼還是考慮優化,我們發現,每個數都能唯一分解,而在求冪時會有重複計算的質因子冪。於是,我們考慮線篩,這樣就可以用每個數的最小質因子冪去算它的冪了,那麼整個過程只會對$n\leq 10^7$內的質數進行快速冪,最後複雜度就成了$\sqrt n \log k$,完全可行。
所以最後就只需再$o(n)$掃一遍因子累加貢獻求和就好了。
**:
#include#define il inline#define ll long long
#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
using
namespace
std;
const
int n=1e7,mod=1e9+7
;int prime[n+5],ans,cnt,n,k,sum[n+5
];bool isprime[n+5
];il
intfast(ll s,ll k)
return
ans;
}il
void
init()
}}int
main()
loj124 除數函式求和 1
loj124 除數函式求和 1 sum n sum d k sum n i k 不能直接數論分塊了,但是一看資料範圍,可以線性篩啊 怎麼篩呢?可以把所有的 i k 篩出來。就是質數直接算,其他的根據 a b k a k b k 在被篩掉的時候遞推出來。1 include2 include3 incl...
LOJ124 除數函式求和 1 線性篩
給定 n le 10 7,k 求 sum n sigma k i 其中 sigma k n sum d k 自然想到交換求和順序,即 sum n sigma k i sum n sum d k sum n frac n i i k 於是,不妨設 f i i k 則我們可以對每個 f i 在 o lo...
1 24學習計畫
1 在我們第乙個課題的基礎上。改寫定時器中斷的內容,做到每隔1s閃爍,再每隔2s閃爍,再隔3s閃爍,然後一直這樣迴圈,其他的led還有示波器都和原來的要求一樣。一遍一遍的對照著led0開始計算led1是不是已經達到了迴圈的要求。1 每隔一秒閃爍 則週期為2 每隔2s閃爍則週期為4 每隔3s閃爍,週期...