hdu3063 2010.3.6
不错的高精度求余
Play game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 148 Accepted Submission(s): 84
Problem Description
幼儿园的老师总是喜欢和孩子们玩游戏,他们经常会让孩子们围成一圈,然后开始玩报数游戏,从其中的一个孩子开始,1,2,3,4,5......一个个报下去,如果一个孩子报错了,那么那个孩子就要表演节目给大家看哦。
今天,学校里新来了一个小明老师,她突发奇想,想考考大家,于是她也出了一个游戏,游戏规则是这样的:
1.n个孩子们站成一排,编号分别是1,2,3,4......n
2.孩子们手上都拿着一张纸,若这个孩子的编号是i,那么纸上的数字是i*(i+1)*(i+2)
3.如果孩子只说出自己的纸上的数字, 那么是不难的,可是, 孩子要说出,前面所有孩子和自己纸上的和.例如,晶晶的编号是2,那么她要说1*2*3+2*3*4 = 30,其实很好懂,对不对。。。
哎,这可为难了小朋友啊,那么难的题目,而且, 那么多的小朋友, 该怎么办呢,你来帮帮他们好吗?
Input
输入孩子的编号n(1<=n<=10^100)
Output
孩子该报出来的数,最后 mod 9999
Sample Input
1
2
3
Sample Output
6
30
90
Source
2009 Multi-University Training Contest 16 -Host by NIT
Recommend
lcy
#include <stdio.h>
#include <string.h>
#define N 5000
int ans[N],num[N],mid[N],temp[N],ltemp,lans,lnum,lmid,goal;
void mulansnum()
{
int i,j;
memset(mid,0,sizeof(mid));
for(i=1;i<=lans;i++)
for(j=1;j<=lnum;j++)
{
mid[i+j-1]+=ans[i]*num[j];
mid[i+j]+=mid[i+j-1]/10;
mid[i+j-1]%=10;
}
lmid=lans+lnum-1;
while (mid[lmid+1])
{
lmid++;
mid[lmid]+=mid[lmid-1]/10;
mid[lmid-1]%=10;
}
lans=lmid;
memcpy(ans,mid,sizeof(mid));
}
void addnum()
{
int i;
num[1]++;
for(i=2;i<=lnum;i++)
{
num[i]+=num[i-1]/10;
num[i-1]%=10;
}
while (num[lnum+1])
{
lnum++;
num[lnum]+=num[lnum-1]/10;
num[lnum-1]%=10;
}
}
void step1()
{
int i;
memcpy(ans,num,sizeof(num));
memset(mid,0,sizeof(mid));
lans=lnum;
for(i=1;i<=3;i++)
{
addnum();
mulansnum();
}
}
void step2()
{
int i,j;
memcpy(mid,ans,sizeof(ans));
lmid=lans;
for(i=1;i<25;i++)
{
ltemp=lans>lmid?lans:lmid;
memset(temp,0,sizeof(temp));
for(j=1;j<=ltemp;j++)
{
temp[j]+=ans[j]+mid[j];
temp[j+1]+=temp[j]/10;
temp[j]%=10;
}
while (temp[ltemp+1])
{
ltemp++;
temp[ltemp]+=temp[ltemp-1]/10;
temp[ltemp-1]%=10;
}
memcpy(ans,temp,sizeof(temp));
lans=ltemp;
}
}
void step3()
{
goal=0;
int i,j,t,k;
for(i=3;i<=lans;i=i+4)
{
t=0;
j=i+3;
for(k=j;k>=i;k--)
t=t*10+ans[k];
goal+=t;
}
printf("%d\n",goal%9999);
}
void main()
{
char ch[10],s[200];
int ls,i;
while (scanf("%s",s)!=EOF)
{
gets(ch);
ls=strlen(s);
for(i=0;i<ls;i++)
num[ls-i]=s[i]-48;
lnum=ls;
step1();
step2();
step3();
}
}