HDU4372 Count the Buildings
Title Description
Solution
The idea is wonderful.
Consider a sequence separate from the highest building, on the left you can see
a right you can see
, one building can be seen, it is certainly no higher than its previous buildings, there are several shorter than its buildings after which, considering such a high number of low buildings + seen as a group of buildings, removal of the highest buildings, the equivalent of the left has
group, have the right
group, a total of
group, the total number of programs corresponding to the program number of each group into the building by the number of programs are arranged between the groups.
Clearly arranged between the groups, the number of programs , and the program numbers are grouped number into number of programs arranged in a circle.
time complexity 。
Code
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>
#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se second
using namespace std;
template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }
typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;
const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=2005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{
int f=1,x=0; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }
return x*f;
}
int s[MAXN][MAXN],c[MAXN][MAXN];
void init()
{
for (int i=0;i<MAXN;i++) c[i][0]=c[i][i]=1;
for (int i=0;i<MAXN;i++) s[i][i]=1;
for (int i=1;i<MAXN;i++)
for (int j=1;j<i;j++)
{
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mods;
s[i][j]=(1ll*(i-1)*s[i-1][j]+s[i-1][j-1])%mods;
}
return;
}
int main()
{
init();
int Case=read();
while (Case--)
{
int n=read(),f=read(),b=read(),ans=1ll*s[n-1][f+b-2]*c[f+b-2][f-1]%mods;
printf("%d\n",ans);
}
return 0;
}