給出n,m,求∑n
i=1i
mmi ∑i=
1nim
mi
n<=109
,m<=
1000
n
<=109
,m
<=
1000
當m=1
m =1
時這顯然是乙個自然數冪和,用插值法來求就好了。
考慮當m
>
1 m
>
1的時候,設s=
∑i=1
nimm
i s=∑
i=1n
immi
兩邊同乘m m
可得ms=∑i
=1ni
mmi+
1' role="presentation" style="text-align: center; position: relative;">ms=
∑i=1
nimm
i+1m
s=∑i
=1ni
mmi+
1兩式相減得到(m
−1)s
=∑i=
1mim
(mi+
1−mi
) (m−
1)s=
∑i=1
mim(
mi+1
−mi)
=∑i=2nm
i((i
−1)m
−im)
−m+n
mmn+
1 =∑i
=2nm
i((i
−1)m
−im)
−m+n
mmn+
1把左邊部分用二項式定理展開一下可得=∑
i=2n
mi∑j
=0m−
1cjm
ij(−
1)m−
j =∑i
=2nm
i∑j=
0m−1
cmji
j(−1
)m−j
交換主體=∑
j=0m
−1cj
m(−1
)m−j
∑i=2
nmii
j =∑j
=0m−
1cmj
(−1)
m−j∑
i=2n
miij
對於j j
我們可以列舉,對於右邊
∑' role="presentation" style="position: relative;">∑
∑的求法可以參照
這篇文章。
時間複雜度是o(
m2) o(m
2)
至於更難的加強版
2 2
,感覺不是很做的動,以後再來補坑好了。
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int n=1005;
const int mod=1000000007;
int n,m,jc[n],ny[n],s[n];
int ksm(int
x,int
y) return ans;
}int c(int n,int
m)void prework(int k,int r)
s[i]=(ll)s[i]*ksm(r-1,mod-2)%mod;
}}int main()
prework(m,m);
int ans=((ll)ksm(n,m)*ksm(m,n+1)%mod-m)%mod;
for (int j=0;j<=m-1;j++)
if ((m-j)&1) (ans-=(ll)c(m,j)*(
s[j]-m)%mod)%=mod;
else (ans+=(ll)c(m,j)*(
s[j]-m)%mod)%=mod;
printf("%d",((ll)ans*ksm(m-1,mod-2)%mod+mod)%mod);
return
0;}
BZOJ 3157 3516 4126 國王奇遇記
目錄題目傳送門1 題目傳送門2 題目傳送門3 計算 sum i m m i 10 9 7 1 leq n leq 10 9 bzoj3157 1 leq m leq 200 bzoj3516 1 leq m leq 1000 bzoj4126 1 leq m leq 50000 一般題目短的都很毒這...
BZOJ4711 小奇挖礦
題目背景 小奇在喵星系使用了無限非概率驅動的採礦機,以至於在所有星球上都採出了一些礦石,現在它準備建一些礦石倉 庫並把礦石運到各個倉庫裡。問題描述 喵星系有n個星球,標號為1到n,星球以及星球間的航線形成一棵樹。所有星球間的雙向航線的長度都為1。小奇要 在若干個星球建礦石倉庫,設立每個倉庫的費用為k...
bzoj3157 國王奇遇記
emmm。直接看題解好了 o m 不懂扔掉 總之,給我們另乙個處理複雜求和的方法 找到函式之間的遞推公式!這裡用錯位相減,然後想辦法轉化 由於根據二項式定理,展開之後會出現k i的乘方,所以展開,有助於變成f j 遞推下去 o m 2 include define reg register int ...