时间限制: 1000ms 内存限制: 65536KB
问题描述
国王给他忠诚的骑士金币。在他服役的第一天,骑士得到一枚金币。在接下来的两天中(服役的第二天和第三天),骑士得到了两枚金币。在接下来的三天中(服役的第四天,第五天,第六天),骑士得到了三枚金币。在接下来的四天中(服役的第七天,第八天,第九天和第十天),骑士得到了四枚金币。这种模式的支付方式是不确定的:在得到了N枚金币后,这个骑士会在接下来的N+1天中每天得到N+1枚金币,N是任意的正整数。
你编的程序会决定这任意一天付给骑士的金币的数目(从第一天开始)
输入描述
输入最少包含一行,但是不要多于21行。输入的每一行(除去最后一行)包含一个可以进行一次程序运行的数字,是一个确切的整数(在1..10000的范围内)代表了天数。输入的最后是以含0的一行为标志的。
输出描述
对应于每一次程序运行对应一行输出。这一行包含对应于输入行的天数,跟着一个空格和在这些天中支付给骑士金币的总数,从第一天开始。
样例输入
106711151610010000100021220
样例输出
10 306 147 1811 3515 5516 61100 94510000 9428201000 2982021 9122 98
来源
Rocky Mountain 2004
问题分析:
这个题与《》完全相同,代码直接拿过来就可以了。
程序说明:
参见参考链接。
参考链接:
题记:程序写多了,似曾相识的也就多了。
AC的C++程序如下:
/* UVALive3045 POJ2000 ZOJ2345 Gold Coins */ #include#define MAXN 10000 int ans[MAXN+1] = {0}; void maketable() { int i, j, k; j = 1; /* Ai, S=1,2,2,3,3,3,4,4,4,4,...... */ k = 1; /* 同值计数变量:j值够j个(用k来计数, k=j时)则j增1 */ for (i=1; i<=MAXN; i++){ ans[i] = j + ans[i - 1]; if (k == j){ j++; k = 0; } k++; } } int main(void) { int n; maketable(); while(scanf("%d", &n) != EOF && n != 0) printf("%d %d\n", n, ans[n]); return 0; }