1. 程式人生 > >HEX SDUT 3896 17年山東省賽D題

HEX SDUT 3896 17年山東省賽D題

技術 include 矩形 理解 -a play clas long long ear

HEX SDUT 3896 17年山東省賽D題
這個題是從矩形的左下角走到右上角的方案數的變形題,看來我對以前做過的題理解還不是太深,或者是忘了。對於這種題目,直接分析它的性質就完事了。從(1,1)走到(a,b)向左走的步數和向右走的步數是確定的,向下是代表向左向右各走了一步。細節:利用對稱性,線性推逆元

對於每一種情況,向左下、向右下、向下的次數都是確定的,然後,對於每一種方向內部順序不用考慮,然後排列組合就完事了
對稱性上又出錯了,哎,自己也沒找個小數據試一下,就...(a,b)和(a,a-b+1)是對稱的

技術分享圖片
#include<iostream>
#include<cstdio>
#include
<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<map> #include<stack> #include<cstring> #define inf 2147483647 #define ls rt<<1 #define rs rt<<1|1 #define lson ls,nl,mid,l,r #define rson rs,mid+1,nr,l,r #define
N 100010 #define For(i,a,b) for(long long i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() using namespace std; long long l,r,x,y,d; long long a[100010],inv[100010]; long long p=1000000007; long long ans; long long down; void in(long long &x){ long long y=1; char c=g();x=0;
while(c<0||c>9){ if(c==-)y=-1; c=g(); } while(c<=9&&c>=0){ x=(x<<1)+(x<<3)+c-0;c=g(); } x*=y; } void o(long long x){ if(x<0){ p(-); x=-x; } if(x>9)o(x/10); p(x%10+0); } long long ksm(long long a,long long b,long long p){ while(b%2==0){ a*=a; a%=p; b>>=1; } long long r=1; while(b>0){ if(b%2==1){ r*=a; r%=p; } a*=a; a%=p; b>>=1; } return r; } void clear(){ ans=0; down=0; } int main(){ a[0]=1; For(i,1,100000) a[i]=(a[i-1]*i)%p; For(i,0,100000) inv[i]=ksm(a[i],p-2,p)%p; while(cin>>x>>y){ clear(); y=max(y,x-y+1); l=x-y; r=y-1; while(l>=0&&r>=0){ ans+=a[l+r+down]*inv[l]%p*inv[r]%p*inv[down]%p; ans%=p; l--; r--; down++; } o(ans);p(\n); } return 0; }
View Code

HEX SDUT 3896 17年山東省賽D題