日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABC240G Teleporting Takahashi[组合数学]

發布時間:2024/1/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABC240G Teleporting Takahashi[组合数学] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:走 N N N步從 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)走到 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)的不同路徑條數(每一步不能不走且步長為1)
不失一般性的我們可以設 ( X , Y , Z > 0 ) (X,Y,Z>0) (X,Y,Z>0)
首先考慮走 ( X + Y + 2 k ) (X+Y+2k) (X+Y+2k)步從 ( 0 , 0 ) (0,0) (0,0)走到 ( X , Y ) (X,Y) (X,Y)
枚舉 X X X正方向的步數 ( X + i ) (X+i) (X+i),總的走法就是
C x + y + 2 k k ∑ i = 0 k C k i × C x + y + k x + i = C x + y + 2 k k ∑ i = 0 k C k k ? i × C x + y + k x + i = C x + y + 2 k k × C x + y + 2 k y + k C^k_{x+y+2k}\sum _{i=0}^{k}C_k^i\times C_{x+y+k}^{x+i}=C^k_{x+y+2k}\sum _{i=0}^{k}C_k^{k-i}\times C_{x+y+k}^{x+i}=C^k_{x+y+2k} \times C_{x+y+2k}^{y+k} Cx+y+2kk?i=0k?Cki?×Cx+y+kx+i?=Cx+y+2kk?i=0k?Ckk?i?×Cx+y+kx+i?=Cx+y+2kk?×Cx+y+2ky+k?
其中 C x + y + 2 k k C^k_{x+y+2k} Cx+y+2kk?枚舉了多走的 k k k步的位置, C k i × C x + y + k x + i C_k^i\times C_{x+y+k}^{x+i} Cki?×Cx+y+kx+i?分別枚舉了 X X X方向回退的 i i i步的位置和 X X X方向走的 ( X + i ) (X+i) (X+i)步位置
其中等式 ∑ i = 0 k C k k ? i × C x + y + k x + i = C x + y + 2 k y + k \sum _{i=0}^{k}C_k^{k-i}\times C_{x+y+k}^{x+i}=C_{x+y+2k}^{y+k} i=0k?Ckk?i?×Cx+y+kx+i?=Cx+y+2ky+k?是著名的范德蒙恒等式
一般形式為 ∑ i = 0 k C m k ? i × C n i = C m + n k \sum _{i=0}^{k}C_{m}^{k-i}\times C^i_{n}=C^k_{m+n} i=0k?Cmk?i?×Cni?=Cm+nk?
推導過程如下:

考慮在一堆和為 ( m + n ) (m+n) (m+n)數量的物品中選 k k k個的方案數,考慮前 n n n個中選了 i i i個,后 m m m個中選了 ( k ? i ) (k-i) (k?i)個的方案,枚舉所有 i i i求和就得到了答案。

接下來考慮 Z Z Z方向上的情況,剩余未考慮的步數為 N ? ( X + Y + 2 k ) N-(X+Y+2k) N?(X+Y+2k),這些步數中朝 Z Z Z負方向的有 ( N ? ( X + Y + Z + 2 k ) ) / 2 (N-(X+Y+Z+2k))/2 (N?(X+Y+Z+2k))/2步,其余為正方向
則對于某個 k k k,方案為
C x + y + 2 k k × C x + y + 2 k y + k × C N N ? ( x + y + 2 k ) × C N ? ( X + Y + 2 k ) ( N ? ( X + Y + Z + 2 k ) ) / 2 C^k_{x+y+2k} \times C_{x+y+2k}^{y+k}\times C^{N-(x+y+2k)}_{N}\times C^{(N-(X+Y+Z+2k))/2}_{N-(X+Y+2k)} Cx+y+2kk?×Cx+y+2ky+k?×CNN?(x+y+2k)?×CN?(X+Y+2k)(N?(X+Y+Z+2k))/2?
枚舉所有 k k k就得到了答案,復雜度 O ( N ) O(N) O(N)

#include<bits/stdc++.h> #define ll long long using namespace std; const int mod=998244353; ll poww(ll a,ll b) {ll t=1;while(b){if(b&1)t=a*t%mod;a=a*a%mod;b>>=1;}return t; } ll inv(ll x) {return poww(x,mod-2); } ll P1[10000005],P2[10000005]; void init() {P1[0]=1;for(int i=1;i<=10000000;i++)P1[i]=1LL*P1[i-1]*i%mod;P2[10000000]=inv(P1[10000000]);for(int i=9999999;i>=0;i--)P2[i]=1LL*P2[i+1]*(i+1)%mod; } ll C(ll n,ll m) {return 1LL*P1[n]*P2[m]%mod*P2[n-m]%mod; } int main() {init();ll N,X,Y,Z;scanf("%lld%lld%lld%lld",&N,&X,&Y,&Z);X=abs(X);Y=abs(Y);Z=abs(Z);ll left=N-X-Y-Z;if(left<0||(left%2!=0))printf("0");else{ll ans=0;for(int k=0;k<=left/2;k++){ans=(ans+1LL*C(X+Y+2*k,k)*C(X+Y+2*k,Y+k)%mod*C(N,N-(X+Y+2*k))%mod*C(N-(X+Y+2*k),(N-(X+Y+2*k+Z))/2)%mod)%mod;}printf("%lld\n",ans);} return 0; }

總結

以上是生活随笔為你收集整理的ABC240G Teleporting Takahashi[组合数学]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。