求 $ \displaystyle \sum_^n i^k \ mod (1e9+7), n \leq 10^9, k \leq 10^6$.
cf622f
易知答案是乙個 $k+1$ 次多項式,我們找 $k+2$ 個值代進去,然後拉格朗日插值。
$n+1$ 組點值對 $(x_i, y_i)$,得到 $n$ 次多項式 $f$ 的拉格朗日插值公式為:
$$f(x) = \sum_^n y_i\prod_ \frac$$
時間複雜度為 $o(n^2)$,
如果我們取 $n$ 個連續的值,這樣可以預處理階乘,複雜度降至 $o(n)$,
在這題中複雜度為 $o(k log)$,其中 $o(log mod)$為求逆元的時間。
#includeusingnamespace
std;
typedef
long
long
ll;const ll mod = 1e9 + 7
;const
int maxk = 1000000 + 10
;ll n, k;
ll qpow(ll m, ll n, ll mod)
return
res;
}ll fac[maxk], y[maxk];
//前k+2項字首和都已經算好
ll largrange()
return
ans;
;}int
main()
預處理逆元階乘,此時時間複雜度的瓶頸在求前 $k+2$ 項和,所以總的時間複雜度為 $o(klogk)$。
51nod-1258序列求和v4
#includeusingnamespace
std;
typedef
long
long
ll;const ll mod = 1e9 + 7
;const
int maxk = 5e4 + 10
;ll n, k;
ll qpow(ll m, ll n, ll mod)
return
res;
}ll inv[maxk], fac[maxk];
//階乘的逆元
void
init()
ll y[maxk];
//前 k+2 項自然數 k 次冪和 也就是yi
ll pre[maxk], suf[maxk]; //
字首積 字尾積
ll largrange()
return
ans;
;}int
main()
return0;
}
1. 2.
3.
解題報告 CF622F
懶得碼字了 很簡單的數論題,紫題顯然是過了些,不要說.對於這個式子,是乙個 k 1 次的多項式,插 k 2 次值就好了,煩人的是處理逆元,我的費馬小定理顯然是 o logp 的,可以用拓歐,聽說還有 o k 的演算法,我似乎感覺不太可能 我太弱了 預處理處階乘,前 字尾積陣列即可,複雜度 o klo...
總結 15 自然數冪和相關
目錄hany01。meowww。我們希望找到乙個演算法求出下面式子的值。s sum i k 一般來說要求時間複雜度不能與 n 有關。乙個有用的結論 s 是乙個關於 n 的 k 1 次多項式。這是乙個中學老師 大概 要講的做法。推導可以用擾動法,也可以用裂項相消法。擾動法 記 s n sum a k ...
自然數冪求和方法2 斯特林數
x n sum limits n left n k end right x x sum limits n left beginn k end right x k 依然用到求兩次的思想 對於 x n 可以理解為用x種顏色給n個點染色 我們有兩種求法 1.每個點有x種染色方案,x n 2.總共染k種顏色...