您的位置:首页 > 其它

[HDU 4828] Grids

2015-04-18 23:00 211 查看

Grids

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 562 Accepted Submission(s): 223

[align=left]Problem Description[/align]
  度度熊最近很喜欢玩游戏。这一天他在纸上画了一个2行N列的长方形格子。他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案。不过画了很久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?

[align=left]Input[/align]
  第一行为数据组数T(1<=T<=100000)。
  然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小。

[align=left]Output[/align]
  对于每组数据,输出符合题意的方案数。由于数字可能非常大,你只需要把最后的结果对1000000007取模即可。

[align=left]Sample Input[/align]

2
1
3

[align=left]Sample Output[/align]

Case #1:
1
Case #2:
5

Hint

对于第二组样例,共5种方案,具体方案为:


[align=left]Source[/align]
2014年百度之星程序设计大赛 - 初赛(第一轮)

逆元、

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 1000010

int dp
;

int exgcd(int a,int b,int& x, int& y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int inv(int a,int MOD)
{
int x,y;
exgcd(a,MOD,x,y);
x=(x%MOD+MOD)%MOD;
return x;
}
void init()
{
int MOD=1000000007;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=N-10;i++)
{
dp[i]=( (ll)dp[i-1]*(4*i-2)%MOD * (ll)inv(i+1,MOD))%MOD;
}
}
int main()
{
init();
int T,n,iCase=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("Case #%d:\n%d\n",iCase++,dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: