先膜一發miskcoo,大佬的部落格上多項式相關的非常全
原題戳我
求\[\sum\limits_^i^mm^i
\]設乙個函式\(f(i)=\sum\limits_^j^im^j\)
然後貌似用乙個叫擾動法(感覺就是錯位相消法)的東西,算一下
\[(m-1)f(i)=\sum\limits_^(j-1)^im^j-\sum\limits_^j^im^j=n^im^-\sum\limits_^m^j[(j-1)^i-j^i]
\]其中,\((j-1)^i-j^i\)可以用一波二項式展開化為\(\sum\limits_^\binom(-1)^j^k\),回帶可得
\[(m-1)f(i)=n^im^-\sum\limits_^m^j\sum\limits_^\binom(-1)^j^k$$$$=n^im^-\sum\limits_^\binom(-1)^\sum\limits_^j^km^j$$$$=n^im^-\sum\limits_^\binom(-1)^f(k)
\]然後就有了乙個\(o(m^2)\)的遞推做法,還有乙個\(o(m)\)的,但看起來挺麻煩的,咕了
以下是**,注意初值\(f(0)\)的設定還有\(m=1\)時的特判
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define ull unsigned long long
#define pii pair#define uint unsigned int
#define mii map#define lbd lower_bound
#define ubd upper_bound
#define inf 0x3f3f3f3f
#define iinf 0x3f3f3f3f3f3f3f3fll
#define vi vector#define ll long long
#define mp make_pair
#define pb push_back
#define re register
#define il inline
#define mod 1000000007
#define m 1000
int n, m;
int c[m+5][m+5];
int f[m+5];
int fpow(int x, int p)
return ret;
}void init()
int main()
init();
for(int i = 1; i <= m; ++i)
f[i] = (1ll*f[i]*fpow(m-1, mod-2)%mod+mod)%mod;
} printf("%d\n", f[m]);
return 0;
}
bzoj3157 國王奇遇記
emmm。直接看題解好了 o m 不懂扔掉 總之,給我們另乙個處理複雜求和的方法 找到函式之間的遞推公式!這裡用錯位相減,然後想辦法轉化 由於根據二項式定理,展開之後會出現k i的乘方,所以展開,有助於變成f j 遞推下去 o m 2 include define reg register int ...
BZOJ 3157 國王奇遇記
bzoj 3157 傳送門 題意 求解 sum n m i cdot o m 2 做法 定義乙個函式 f i f i sum n k i cdot m 1 cdot f i sum n k i cdot m sum n k i cdot m k sum k 1 i cdot m k sum n k ...
擾動法 BZOJ3157 國王奇遇記
求 sum ni mm i n leq 1e9,m leq 200 其實我也不知道這東西為啥叫 擾動法 大概是在黑暗的邊緣試探?就是那種,人家再多一點就被您看破了,然後您就一定要搞他那麼一點去試探他的限度,一不小心給他搞爆了,這種感覺。擾動三連 等比數列求和 sum na i,a i a 1 q 令...