ABC145 D - Knight(找规律,杨辉三角)

    科技2022-07-15  114

    题意:

    解法:

    先画图,根据每个位置的方案数找找规律: 发现是杨辉三角: 1 11 121 1331 …

    杨辉三角:(下标从0开始)0层x+y=0,1层x+y=3,2层x+y=6, ... 显然层数t=(x+y)/3,如果(x+y)%3!=0说明无法到达(x,y),答案为0. 现在要计算(x,y)是这一层的第几个. 第t层的第一个:(t*2,t), 而且同一层的横纵坐标只相差1, 那么(x,y)是第y-t个,答案为C(t,y-t)

    code:

    #include<bits/stdc++.h> using namespace std; #define int long long const int maxm=1e6+5; const int mod=1e9+7; int fac[maxm],inv[maxm]; int x,y; int C(int n,int m){ if(m>n||m<0)return 0; return fac[n]*inv[m]%mod*inv[n-m]%mod; } int ppow(int a,int b,int mod){ int ans=1%mod;a%=mod; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } void init(){ fac[0]=1; for(int i=1;i<maxm;i++)fac[i]=fac[i-1]*i%mod; inv[maxm-1]=ppow(fac[maxm-1],mod-2,mod); for(int i=maxm-2;i>=0;i--)inv[i]=(i+1)*inv[i+1]%mod; } signed main(){ init(); cin>>x>>y; if((x+y)%3){ cout<<0<<endl; }else{ int t=(x+y)/3; int p=y-t; int ans=C(t,p); cout<<ans<<endl; } return 0; }
    Processed: 0.225, SQL: 8