給定乙個多項式(by
+ax)
k(by+ax)^k
(by+ax
)k,求多項式展開後xn×
ym
x^n \times y^m
xn×y
m項的係數。這個係數可能很大,只需要求出對10007取模後的結果。(0≤
a,b≤
106,
k≤
1000
)(0≤a,b≤10^6, k \leq 1000)
(0≤a,b
≤106
,k≤1
000)
這是一道很簡單的數論題,但我感覺從裡面學到了很多知識。首先就是二項式定理:(x+
y)n=
∑k=0
n(nk
)xn−
ky
k(x+y)^n = \sum\limits_^n x^y^k
(x+y)n
=k=0
∑n(
kn)
xn−k
yk。那麼對於xn×
ym
x^n \times y^m
xn×y
m項,只需要套公式就行了,答案為(km
)×am
×b
n\times a^m \times b^n
(mk)×
am×b
n。對於( km
)(m
k),由於k
kk比較大,所以我們需要找一種高效的求組合數的方式。如果用楊輝三角感覺複雜度有點高(o(k
2)
o(k^2)
o(k2
))。但是有這樣乙個等式(kn
)=n−
k+1k
(k−1
n)
= \frac
(nk)=
kn−k
+1(
nk−1
),如果我們從(0n
)(n
0)開始從左到右推可以線性的求出組合數的值。
但是問題又來了,這個演算法計算的時候需要除以k
kk,而除法在模運算下不成立。我們可以利用模運算的逆來解決這個問題。原公式變為(kn
)=(n
−k+1
)(k−
1n)×
k−1m
od
10007
= (n - k +1) \times k^ \mod 10007
(nk)=
(n−k
+1)(
nk−1
)×k
−1mo
d100
07。因為模數是質數且大於k
kk,所以一定存在k
kk對於10007的逆元。求逆元的方法就多了,可以用快速冪法,也可以用擴充套件歐幾里得,都是o
(logn
)o(\log n)
o(logn
)的複雜度。至於兩個數的冪,可以使用快速冪輕鬆解決,然後乘起來就是答案了。
o (k
logk+
logn)
o(k\log k + \log n)
o(klogk+
logn
)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int inf =
2147483647
;const
int inf2 =
0x3f3f3f3f
;const ll inf64 =
1e18
;const
double infd =
1e30
;const
double eps =
1e-6
;const
double pi =
3.1415926
;const ll mod =
1e9;
inline
intread()
while
(isdigit
(ch)
) x =
(x <<3)
+(x <<1)
+(ch ^48)
, ch =
getchar()
;return w ?
-x : x;
}int
quickm
(ll x, ll p,
int mod)
return ans;
}int n, m;
int case;
const
int maxn =
1005
;ll s[maxn]
;int
main()
int xn = s[n]
;int bb =
quickm
(b, m,
10007);
int aa =
quickm
(a, n,
10007);
ll ans =
((ll)xn *
(ll)aa)
%10007
; ans *
=(ll)bb;
ans %
=10007
;printf
("%lld\n"
, ans)
;return0;
}
洛谷P1313 計算係數 數論,數學
求 a x by k a x by k展開式中anb manb m項的係數。眾所周知,x y k x y k展開式中anb manb m項的係數就是楊輝三角第k 1 k 1行m 1m 1列的數字。假定為f n 1 m 1 f n 1 m 1 那麼很明顯,ax by k ax by k展開式中anb ...
數論 洛谷P1313計算係數
給定乙個多項式 by ax k,請求出多項式展開後x n y m 項的係數。輸入格式 輸入檔名為factor.in。共一行,包含5 個整數,分別為 a b k n m,每兩個整數之間用乙個空格隔開。輸出格式 輸出共1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對10007 取模後的結果...
洛谷 P1313 計算係數
題目描述 給定乙個多項式 by ax k,請求出多項式展開後x n y m 項的係數。輸入輸出格式 輸入格式 輸入檔名為factor.in。共一行,包含5 個整數,分別為 a b k n m,每兩個整數之間用乙個空格隔開。輸出格式 輸出共1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對...