題解 | #[HNOI2012]排隊#
阿新 • • 發佈:2021-06-20
站隊問題,插空法的變形
注意!!別忘記寫高精度!!!!
注意!!別忘記寫高精度!!!!
1.首先,如果只有兩種人的話我們直接使用插空法就好了
對於n個男生和m個女生,如果要求女生之間不站在一起,首先讓男生任意排列,在每個男生之間的空位(加上開頭和結尾)一共n+1個位置中任意選取m個位置來讓女生站隊,最後在對女生進行任意排列
下面奉上程式碼:
//萬能標頭檔案 #include<bits/stdc++.h> using namespace std; int ans[MAXN]={0}; int cnt=1; //高精度乘法 void multi(int x){ for(int i=1;i<=cnt;i++){ ans[i]=x; } //進位 for(int i=1;i=10){ ans[cnt+1]+=ans[cnt]/10,ans[cnt]%=10; cnt++; } } int n,m; //所有乘法操作 void op(){ multi(n*n+3n+2m); for(int i=1;i<=n+1;i++) multi(i); for(int i=n+4-m;i<=n+2;i++) multi(i); } int main(){ memset(ans,0,sizeof(ans)); ans[1]=1; scanf("%d %d",&n,&m); op(); //輸出 for(int i=cnt;i>=1;i--){ printf("%d",ans[i]); } return 0; }