记录编号 |
45373 |
评测结果 |
AAAAAAAA |
题目名称 |
[清江中学2010] 跳格子I |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
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;
}