hdoj 4828 卡特兰数取模
Grids
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 93 Accepted Submission(s): 25
他想把1到2N这些数依次放进去。可是为了使格子看起来优美,他想找到使每行每列都递增的方案。只是画了非常久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?
然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小。
因为数字可能很大,你仅仅须要把最后的结果对1000000007取模就可以。
2
1
3
Case #1:
1
Case #2:
5Hint对于第二组例子。共5种方案,详细方案为:
![]()
通过打表得出前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 卡特兰数取模的更多相关文章
- HDU-4828 卡特兰数+带模除法
题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数 ...
- uva 10692 Huge Mods 超大数取模
vjudge上题目链接:Huge Mods 附上截图: 题意不难理解,因为指数的范围太大,所以我就想是不是需要用求幂大法: AB % C = AB % phi(C) + phi(C) % C ( B ...
- bjfu1238 卡特兰数取余
题目就是指定n,求卡特兰数Ca(n)%m.求卡特兰数有递推公式.通项公式和近似公式三种,因为要取余,所以近似公式直接无法使用,递推公式我简单试了一下,TLE.所以只能从通项公式入手. Ca(n) = ...
- HDU 4828 (卡特兰数+逆)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...
- HOJ 13101 The Triangle Division of the Convex Polygon(数论求卡特兰数(模不为素数))
The Triangle Division of the Convex Polygon 题意:求 n 凸多边形可以有多少种方法分解成不相交的三角形,最后值模 m. 思路:卡特兰数的例子,只是模 m 让 ...
- HDU 4828 (卡特兰数+逆元)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...
- Fibonacci数列对任何数取模都是一个周期数列
题目是要求出斐波那契数列n项对一个正整数取模,那么可以把斐波那契数列取模后得到的数列周期求出来. 比如下面一个题目:求出f[n]的后4位,先求出数列对10000取模的周期,然后再查找即可. #incl ...
- 【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)
从(1,1)到(n,m),每次向右或向下走一步,,不能经过(x,y),求走的方案数取模.可以经过(x,y)则相当于m+n步里面选n步必须向下走,方案数为 C((m−1)+(n−1),n−1) 再考虑其 ...
- HPU 1471:又是斐波那契数列??(大数取模)
1471: 又是斐波那契数列?? 时间限制: 1 Sec 内存限制: 128 MB 提交: 278 解决: 27 统计 题目描述 大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; ...
随机推荐
- 使用SpringMVC参数传递时,解决get请求时中文乱码的问题
问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一, 我们需要把request.getParameter(“参数名”)获取到的字符串先 ...
- Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)
知识点一: 进程:资源单位 线程:才是CPU的执行单位 进程的运行: 开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢 线程的运行: 代码的运行过程就相当于运行了一个线程 辅助理解:一座 ...
- [python学习篇][廖雪峰][1]高级特性--列表生成式
>>> import os >>> [d for d in os.listdir(r"d:\temp")] ['0.png', '0.xml', ...
- django html render_to_response
#coding=utf-8 from django.shortcuts import render from blog.models import BlogPost from django.short ...
- 使用ssh建立隧道和web代理
动态端口转发(socket4/5代理): 通过ssh监听本地端口并把数据转发至远程动态端口 转发local port 至 ssh Server ssh -D ssh -qfTnN -D 本地目标端口 ...
- mybatis学习(十二)——mybatis逆向工程
MyBatis Generator (MBG)是一个mabatis的代码生成器,能够根据表自动生成mapper接口,mapper.xml文件,javaBean文件. 1.MBG的下载 打开https: ...
- Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!
因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...
- hdu 2888 二维RMQ
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- javaweb学习总结(十)——HttpServletRequest对象(一)(转)
(每天都会更新至少一篇以上,有兴趣的可以关注)转载自孤傲苍狼 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器 ...
- 数据结构自己实现——Tree and Forest
//中D序??遍???历???二t叉?树??? //先??序??遍???历???二t叉?树??? //后??序??遍???历???二t叉?树??? #include <iostream> ...