HDU4372 Count the Buildings

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 F F a right you can see B B , 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 F 1 F-1 group, have the right B 1 B-1 group, a total of F B 2 F-B-2 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 C ( f + b 2 , b 1 ) C(f+b-2,b-1) , and the program numbers are grouped n 1 n-1 number into f + b 2 f+b-2 number of programs arranged in a circle.

time complexity O ( N 2 + Q ) O(N^2+Q)

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;
}
发布了94 篇原创文章 · 获赞 6 · 访问量 8533

Guess you like

Origin blog.csdn.net/xmr_pursue_dreams/article/details/103500472