Grids

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)

Total Submission(s): 93    Accepted Submission(s): 25

Problem Description
  度度熊近期非常喜欢玩游戏。这一天他在纸上画了一个2行N列的长方形格子。

他想把1到2N这些数依次放进去。可是为了使格子看起来优美,他想找到使每行每列都递增的方案。只是画了非常久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?

 
Input
  第一行为数据组数T(1<=T<=100000)。

  然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小。
 
Output
  对于每组数据,输出符合题意的方案数。

因为数字可能很大,你仅仅须要把最后的结果对1000000007取模就可以。

 
Sample Input
2
1
3
 
Sample Output
Case #1:
1
Case #2:
5
Hint
对于第二组例子。共5种方案,详细方案为:
 
Source

通过打表得出前7项分别为1,2,5,14,42,132,429。可知答案为卡特兰数h(n)=C(2n,n)/(n+1)=h(n-1)*(4*n-2)/(n+1)。

一開始採用组合数分解素因子+二分求幂求组合数取模,但是会TLE。组合数求模相关知识http://hi.baidu.com/aekdycoin/item/e051d6616ce60294c5d249d7。渣代码例如以下:

#include <stdio.h>
#include <string>
#include <iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 2000005;
const int n=148955;
bool a[N];//a[]的长度比pr[]的长度长得多
int pr[n];
#define MOD 1000000007
int num;
void Prime2()
{
memset(a, 0, N*sizeof(a[0]));
int i, j;
num = 0;
a[0]=a[1]=1;
for(i = 2; i < N; ++i)
{
if(!(a[i])) pr[num++] = i;
for(j = 0; (j<num && i*pr[j]<N); ++j)
{
a[i*pr[j]] = 1;
if(!(i%pr[j])) break;
}
}
}
int val[n],len;
void calcJC(int n,int id,int flag){
int ans=0,y,p=pr[id];
while(n){
y=n/p;
ans+=y;
n=y;
}
val[id]=val[id]+ans*flag;
}
__int64 extgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
__int64 r=extgcd(b,a%b,x,y);
__int64 t=x;x=y;y=t-a/b*y;
return r;
}
int MPow(int p,int e){
if(e==0)return 1;
else if(e==1)return p;
int t=p,ans=1;
while(e){
if(e&1)ans=(ans*t)%MOD;
t=(t*t)%MOD;
e>>=1;
}
return ans;
}
int main()
{
Prime2();
int txt,l=1,k,i;
__int64 ans,x,y;
scanf("%d",&txt);
while(txt--){
scanf("%d",&k);
memset(val,0,sizeof(val));
for(i=0;pr[i]<=2*k;++i)
calcJC(2*k,i,1);
for(i=0;pr[i]<=k;++i)
calcJC(k,i,-2);
ans=1;
for(i=0;pr[i]<=2*k;++i){
// if(val[i]>0)printf("%d^%d ",pr[i],val[i]);
ans=(ans*MPow(pr[i],val[i]))%MOD;
}
extgcd(k+1,MOD,x,y);
x=(x+MOD)%MOD;
ans=(ans*x)%MOD;
printf("%I64d\n",ans);
}
return 0;
}

无奈,看到n范围不是非常大,直接打表吧、、、

#include <stdio.h>
#include <string>
#include <iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
#define MOD 1000000007
const int N = 1000001;
int a[N];
__int64 extgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
__int64 r=extgcd(b,a%b,x,y);
__int64 t=x;x=y;y=t-a/b*y;
return r;
}
void calcCATALAN(int n){
__int64 x,y;
a[1]=1;
int i;
for(i=2;i<n;++i){
x=a[i-1];
a[i]=(x*(4*i-2))%MOD;
extgcd(i+1,MOD,x,y);
x=(x+MOD)%MOD;
a[i]=(a[i]*x)%MOD;
}
}
int main()
{
calcCATALAN(N);
int txt,l=1,k;
scanf("%d",&txt);
while(txt--){
scanf("%d",&k);
printf("Case #%d:\n",l++);
printf("%d\n",a[k]);
}
return 0;
}

hdoj 4828 卡特兰数取模的更多相关文章

  1. HDU-4828 卡特兰数+带模除法

    题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数 ...

  2. uva 10692 Huge Mods 超大数取模

    vjudge上题目链接:Huge Mods 附上截图: 题意不难理解,因为指数的范围太大,所以我就想是不是需要用求幂大法: AB % C = AB % phi(C) + phi(C) % C ( B ...

  3. bjfu1238 卡特兰数取余

    题目就是指定n,求卡特兰数Ca(n)%m.求卡特兰数有递推公式.通项公式和近似公式三种,因为要取余,所以近似公式直接无法使用,递推公式我简单试了一下,TLE.所以只能从通项公式入手. Ca(n) = ...

  4. HDU 4828 (卡特兰数+逆)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...

  5. HOJ 13101 The Triangle Division of the Convex Polygon(数论求卡特兰数(模不为素数))

    The Triangle Division of the Convex Polygon 题意:求 n 凸多边形可以有多少种方法分解成不相交的三角形,最后值模 m. 思路:卡特兰数的例子,只是模 m 让 ...

  6. HDU 4828 (卡特兰数+逆元)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...

  7. Fibonacci数列对任何数取模都是一个周期数列

    题目是要求出斐波那契数列n项对一个正整数取模,那么可以把斐波那契数列取模后得到的数列周期求出来. 比如下面一个题目:求出f[n]的后4位,先求出数列对10000取模的周期,然后再查找即可. #incl ...

  8. 【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)

    从(1,1)到(n,m),每次向右或向下走一步,,不能经过(x,y),求走的方案数取模.可以经过(x,y)则相当于m+n步里面选n步必须向下走,方案数为 C((m−1)+(n−1),n−1) 再考虑其 ...

  9. HPU 1471:又是斐波那契数列??(大数取模)

    1471: 又是斐波那契数列?? 时间限制: 1 Sec 内存限制: 128 MB 提交: 278 解决: 27 统计 题目描述 大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; ...

随机推荐

  1. navicat for mysql 在win7下设置定时计划之导出数据处理

    navicat for mysql 在win7下设置定时计划之导出数据处理 博客分类: mysql navitcatmysql定时任务导出  前两篇记录了,navicat for mysql计划的入门 ...

  2. luogu2114 [NOI2014]起床困难综合症

    大约是第一次做近几年NOI题(尽管是签到题)? 制作一个真值表,要是有哪一位原本是0但是能变成1那真是太好啦,要是有哪一位原来是1能变成1并且算上它不会超过m那也不错. #include <io ...

  3. provider:命名管道提供程序,error:40 - 无法打开到SQL Server的连接 (Microsoft

    最近一直在配置服务器, 这当中最头疼的就是配置数据库 我们用的是SQL Server 数据库 2008 版本,数据库配置完之后从另一台电脑访问数据库死活连接不上,提示信息如下 " 无法连接到 ...

  4. 一个TensorFlow例子

    一个TensorFlow的例子 import tensorflow as tf x = tf.constant(1.0, name='input') w = tf.Variable(0.8, name ...

  5. 算法理论——Linear SVM

    问题引入 下面的三个超平面都起到分类的效果,哪个最好? 答案显然是第三个.为什么? 直觉上,如果现在我们有个测试点,非常靠近右下角的那个红叉叉,也就是说这个点的特征与那个红叉叉非常接近,这时候,我们希 ...

  6. Android线程中使用Toast、dialog、loading

    代码改变世界 Android线程中使用Toast.dialog.loading Loading: Thread t1 = new Thread(new Runnable() { @Override p ...

  7. 【bzoj3676】[Apio2014]回文串 回文自动机

    题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最大出现值. 输入 输入只有一行,为一个只包含小写字母( ...

  8. [AtCoderContest075F]Mirrored

    [AtCoderContest075F]Mirrored 试题描述 For a positive integer \(n\), we denote the integer obtained by re ...

  9. HDU-2448 Mining Station on the Sea

    先根据不同的起点跑最短路,记录距离,从而建立二分图求最小匹配. 一开始我求最短路的时候我把港口直接加到图中,然后发现进了港口就不能出来了,所以连接港口的边就要从双向边改成单向边…………这也搞得我n和m ...

  10. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...