地址:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1320
1320: Scoop water
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 272 Solved: 63
[ Submit][ Status][ Web Board]
Description
zzy今天刚买了两个水瓢A和B,容量都是为1升,童心未泯的他打算用这个水瓢来玩游戏。
首先zzy准备了一个容量可看作无穷大的水缸,刚开始水缸是空的,然后用水瓢A往水缸里加水,用水瓢B把水缸里的水舀出去,当使用 水瓢B把水舀出去时水缸里必须要至少有1升的水。这样子使用N次水瓢A,也使用N次水瓢B,最后水缸会依旧空的。
Input
输入有多个例子,直到文件结束。
每个例子仅含一个数N(0<N<=10000),表示你必须使用N次A水瓢和N次B水瓢。
Output
对于每个例子,请输出一个数,表示一共有多少种正确的舀水方式使得舀水过程中 使用B水瓢时水缸里总会有足够的水。
(由于数字比较大,输出的答案模1000000007)
Sample Input
1 2
Sample Output
1 2
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
struct node{
int num[2000];
int g;
}a[10010];
long long int f=1000000007;
void cheng(int t,int m) //大数乘以小数
{
int k=0;
for(int i=0;i<a[t-1].g;i++)
{
a[t].num[i]=a[t-1].num[i]*m+k;
k=a[t].num[i]/10000;
a[t].num[i]%=10000;
}
a[t].g=a[t-1].g;
while(k)
{
a[t].num[a[t].g]=k%10000;
k/=10000;
a[t].g++;
}
}
void chu(int t,int m) //大数除以小数
{
long long int k=0;
for(int i=a[t].g-1;i>=0;i--)
{
k=k*10000+a[t].num[i];
a[t].num[i]=k/m;
k=k%m;
}
while(!a[t].num[a[t].g-1]) a[t].g--;
}
long long int qumo() //取模
{
long long int k=0;
for(int i=a[0].g-1;i>=0;i--)
{
k=k*10000+a[0].num[i];
a[0].num[i]=k/f;
k=k%f;
}
return k;
}
int main()
{
int i,j,l;
long long int ans;
a[1].g=1;a[1].num[0]=1;
for(i=2;i<=10000;i++)
{
cheng(i,4*i-2);
chu(i,i+1);
}
while(scanf("%d",&i)>0)
{
a[0]=a[i];
ans=qumo();
printf("%lld\n",ans);
}
return 0;
}