小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 } 

 

posted @ 2017-11-05 20:25  skylee03  阅读(262)  评论(0编辑  收藏  举报