国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 3907: 網格 (卡特蘭數+組合數學+高精度)

2019-11-08 20:21:39
字體:
來源:轉載
供稿:網友

3907: 網格

Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 398  Solved: 178[Submit][Status][Discuss]

Description

某城市的街道呈網格狀,左下角坐標為A(0, 0),右上角坐標為B(n, m),其中n >= m。現在從A(0, 0)點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點(x, y)都要滿足x >= y,請問在這些前提下,到達B(n, m)有多少種走法。

Input

輸入文件中僅有一行,包含兩個整數n和m,表示城市街區的規模。

Output

輸出文件中僅有一個整數和一個換行/回車符,表示不同的方案總數。

Sample Input

6 6

Sample Output

132

HINT

100%的數據中,1 <= m <= n <= 5 000

Source

[Submit][Status][Discuss]


題解:卡特蘭數+組合數學+高精度

這道題相當于經典的購票問題。

最后的答案是C(n+m,n)-C(n+m,n+1)

這里有一些有關卡特蘭數問題的講解:http://blog.csdn.net/wuyuegb2312/article/details/9339529 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 10003using namespace std;struct data {	int s[N],len;	data (){		memset(s,0,sizeof(s));		len=0;	}}ans,ans1;int n,m,PRime[N],mp[N],pd[N],num[N];void init(){	for (int i=2;i<=10000;i++) {		if (!pd[i]) prime[++prime[0]]=i,mp[i]=prime[0];		for (int j=1;j<=prime[0];j++) {			if (prime[j]*i>10000) break;			pd[prime[j]*i]=1;			if (i%prime[j]==0) break;		}	}}void calc(int x,int val){	int k=x;	for (int i=1;prime[i]*prime[i]<=k;i++) 	 if (k%prime[i]==0) {	 	while (k%prime[i]==0) 	 	 num[i]+=val,k/=prime[i];	 }	if (k>1) num[mp[k]]+=val;}data mul(data a,int x){	data c; int t=a.len;	for (int i=1;i<=a.len;i++) 	 c.s[i]=a.s[i]*x;	for (int i=1;i<=t;i++) {		c.s[i+1]+=c.s[i]/10;		c.s[i]%=10;	}	while (c.s[t+1]) {		t++; c.s[t+1]+=c.s[t]/10;		c.s[t]%=10;	}	c.len=t;	return c;}data jian(data a,data b){	data c;	int t=a.len;	for (int i=1;i<=t;i++) c.s[i]=a.s[i]-b.s[i];	for (int i=1;i<=t;i++) 	 if (c.s[i]<0) c.s[i]+=10,c.s[i+1]--;	while (!c.s[t]) t--;	c.len=t;	return c; }int main(){	freopen("a.in","r",stdin);	freopen("my.out","w",stdout);	scanf("%d%d",&n,&m);	init();	for (int i=n+1;i<=n+m;i++) calc(i,1);	for (int i=1;i<=m;i++) calc(i,-1);	ans.len=ans.s[1]=1;	for (int i=1;i<=prime[0];i++) 	 while (num[i]) ans=mul(ans,prime[i]),num[i]--;	//for (int i=ans.len;i>=1;i--) printf("%d",ans.s[i]);	//printf("/n");	for (int i=m;i<=n+m;i++) calc(i,1);	for (int i=1;i<=n+1;i++) calc(i,-1);    ans1.len=ans1.s[1]=1;	for (int i=1;i<=prime[0];i++) 	 while (num[i]) 	  ans1=mul(ans1,prime[i]),num[i]--;	//for (int i=ans1.len;i>=1;i--) printf("%d",ans1.s[i]);	//printf("/n");	ans=jian(ans,ans1);	for (int i=ans.len;i>=1;i--) printf("%d",ans.s[i]);	printf("/n");}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋城| 乌什县| 乐清市| 开封市| 郓城县| 开江县| 柳江县| 湟源县| 衡阳县| 奉贤区| 林芝县| 陵水| 德保县| 轮台县| 岗巴县| 井陉县| 兴国县| 射阳县| 浦东新区| 阿荣旗| 华坪县| 兴化市| 霸州市| 清新县| 闸北区| 阿城市| 广西| 忻州市| 互助| 紫阳县| 周口市| 德庆县| 琼结县| 富蕴县| 义乌市| 澎湖县| 滁州市| 和田县| 舒兰市| 修文县| 车险|