package main import . "fmt" import . "math/big" const M = 1e9+7 func main() { var a,b,n,k int Scan(&a,&b,&n,&k) a %= M b %= M const Z int = 2e5 xs := make([]int, Z+1) xs[0] = 1 for i := 1; i < len(xs); i++ { xs[i] = xs[i-1]*i%M } ys := make([]int, len(xs)) ys[Z] = int(new(Int).ModInverse(NewInt(int64(xs[Z])), NewInt(M)).Int64()) for i := Z; i > 0; i-- { ys[i-1] = ys[i]*i%M } ans1 := (xs[n-1]*ys[k-1]%M*ys[(n-1)-(k-1)]%M*a%M + xs[n-1]*ys[k-2]%M*ys[(n-1)-(k-2)]%M*b%M)%M Println(ans1) ans2 := 0 tb := 0 for i := 0; i < n; i++ { t := xs[n-1]*ys[i]%M*ys[(n-1)-i]%M e := (t*a%M+tb)%M tb = t*b%M ans2 = (ans2+e*e%M)%M } ans2 = (ans2+tb*tb%M)%M Println(ans2) } /* 考察 よくわからない サンプル1を描いてみる a=1, b=1 1 2 3 4 5 6 1) 1 1 2) 1 2 1 3) 1 3 3 1 4) 1 4 6 4 1 5) 1 5 10 10 5 1 a=3,b=8 を描いてみる 1 2 3 4 5 6 1) 3 8 2) 3 11 8 3) 3 14 19 8 4) 3 17 33 27 8 5) 3 20 50 60 35 8 一般化 1) a b 2) a (a+b) b 3) a (a+(a+b)) ((a+b)+b) b 4) a (a+(a+(a+b))) ((a+(a+b))+((a+b)+b)) (((a+b)+b)+b) b 5) a (a+(a+(a+(a+b)))) ((a+(a+(a+b)))+((a+(a+b))+((a+b)+b))) (((a+(a+b))+((a+b)+b))+(((a+b)+b)+b)) ((((a+b)+b)+b)+b) b 整理 1) a b 2) a (a+b) b 3) a (2a+b) (a+2b) b 4) a (3a+b) (3a+3b) (a+3b) b 5) a (4a+b) (6a+4b) (4a+6b) (a+4b) b 6) a (5a+b) (10a+5b) (10a+10b) (5a+10b) (a+5b) b 7) a (6a+b) (15a+6b) (20a+15b) (15a+20b) (6a+15b) (a+6b) b 例えば 7段目 a 6a 15a 20a 15a 6a a b 6b 15b 20b 15b 6b b aとbそれぞれ左右対称の係数同じなのを1個ずつずらして重ねている感じ 係数はいわゆる二項係数? 二項係数を並べたやつをパスカルの三角形と呼ぶらしい パスカルの三角形をa倍したものとb倍したものを1個ずつずらして並べたということか 二項係数(n,k)を求めa倍とb倍すればいいのかな (n,k) = n! / (k! * (n-k)!) 二乗和は二乗して足すをやるのみ… nの最大は2e5なので計算間に合う */