记录编号 45373 评测结果 AAAAAAAA
题目名称 [清江中学2010] 跳格子I 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.453 s
提交时间 2012-10-23 18:15:54 内存使用 1.57 MiB
显示代码纯文本
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define upn 0
#define don 1 
using namespace std;
const int MAXN=10010;
const int MAXL=7000;
const int MAXP=10010;
int prime[MAXP],pnum=0;
int N,M,Num[2][MAXP]={0},maxwei=0;
class hugeint
{
public:int len,num[MAXL];
	void clear()
	{
		len=0;memset(num,0,sizeof(num));
	}
}ans;

inline void initprime()
{
	for(int i=2;i<=20000;i++)
	{
		bool flag=1;
		for(int j=2;j*j<=i;j++)
		{
			if(i%j) continue;
			flag=0; break;   
		}
		if(flag) prime[++pnum]=i;
	}
}

inline void Decomposition(int pos,int k)
{
	for(int i=1;i<=pnum&&k>1;i++)
	{
		while(!(k%prime[i]))
		{
			Num[pos][i]++;
			k/=prime[i];
		}
		if(i>maxwei) maxwei=i;
	}
}

inline hugeint Transform(int k)
{
	hugeint tmp; tmp.clear();
	while(k)
	{
		tmp.num[++tmp.len]=k%10;k/=10;
	} return tmp;
}

inline hugeint times(hugeint a,hugeint b)
{
	hugeint tmp; tmp.clear();
	tmp.len=a.len+b.len-1;
	for(int i=1;i<=a.len;i++)
		for(int j=1;j<=b.len;j++)
			tmp.num[i+j-1]+=(a.num[i]*b.num[j]);
	for(int i=1;i<=tmp.len;i++)
		tmp.num[i+1]+=tmp.num[i]/10,tmp.num[i]%=10;
	if(tmp.num[tmp.len+1]) tmp.len++; return tmp;
}

inline void output(hugeint tmp)
{
	for(int i=tmp.len;i>=1;i--)
		printf("%d",tmp.num[i]);
} 

int main()
{
	freopen("tiao.in","r",stdin);
	freopen("tiao.out","w",stdout);
	scanf("%d %d\n",&N,&M);
	initprime();
	for(int i=2;i<=M-1;i++) Decomposition(don,i);
	for(int i=N+M-2;i>=N&&i>=2;i--) Decomposition(upn,i);
	ans.len=1;ans.num[1]=1;
	for(int i=1;i<=maxwei;i++)
	{
		Num[upn][i]-=Num[don][i];
		for(int j=1;j<=Num[upn][i];j++)
			ans=times(ans,Transform(prime[i]));
	}  output(ans);
	return 0;
}