小Z的城市之旅
题目大意:
从(0,0)走到(x,y),每次可以向上下左右走一格,问走r步刚好到(x,y)的方案数。
思路:
找规律发现答案就是C((r+x-y)/2,r)*C((r-x-y)/2,r)。
1 #include<cstdio> 2 #include<cctype> 3 #include<algorithm> 4 typedef long long int64; 5 inline int getint() { 6 register char ch; 7 while(!isdigit(ch=getchar())); 8 register int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 10 return x; 11 } 12 const int R=200001,mod=998244353; 13 inline void exgcd(const int &a,const int &b,int &x,int &y) { 14 if(!b) { 15 x=1; 16 y=0; 17 return; 18 } 19 exgcd(b,a%b,y,x); 20 y-=a/b*x; 21 } 22 inline int inv(const int &x) { 23 int ret,tmp; 24 exgcd(x,mod,ret,tmp); 25 return (ret%mod+mod)%mod; 26 } 27 int fact[R],factinv[R]; 28 inline int C(const int &m,const int &n) { 29 return (int64)fact[n]*factinv[m]%mod*factinv[n-m]%mod; 30 }; 31 int main() { 32 fact[0]=factinv[0]=1; 33 for(register int i=1;i<R;i++) { 34 fact[i]=(int64)fact[i-1]*i%mod; 35 factinv[i]=inv(fact[i]); 36 } 37 for(register int T=getint();T;T--) { 38 int x=getint(),y=getint(),r=getint(); 39 if((std::abs(x)+std::abs(y)>r)||(((x+y)&1)^(r&1))) { 40 puts("0"); 41 continue; 42 } 43 printf("%d\n",int((int64)C((r+x-y)>>1,r)*C((r-x-y)>>1,r)%mod)); 44 } 45 return 0; 46 }