Adolf vs AsukaNoKaze
背景
SPOJ上并不牛的一道题。
描述
Adolf Keith Doherty最近在学习C/C++语言。但是由于他的语言功底实在是不到家,所以他尽写出一些错误程序,交题时屡屡吃到Time Limit Exceeded。他很郁闷。
一天AsukaNoKaze来拜访Adolf,看到他写的错程序之后,说道:“这么简单的错误,我一眼就看出怎么改了。”Adolf心中实在是不爽,说道:“我的程序怎么能让你乱改呢。”AsukaNoKaze说:“我又不多改,就改第一个程序的一个字符和第二个程序的一个数。”然后居然一口气说出了第一个程序的三种改法,Adolf一上机运行,果然都能打出42个星号。只是AsukaNoKaze又想了半天才想出第二个程序的改法。原来只需把main函数里的“f10(123456789)”的123456789改为一个100000000到200000000之间的正整数就可以打出一个只由英文大写字母,“,”,“?”,“'”和“.”组成的英语句子。
你的任务就是:
输出第一个程序的三种改法,只需改动一个字符,上机运行,能打出42个星号。
输出第二个程序中123456789应改成的那个数,以及输出的那个英文句子。
附:
第一个程序:
int i, n=42;
main() {
for(i=0; i<n; i--) {
printf("*");
}
}
第二个程序:
#include <stdio.h>
int rex[5];
void f3(int *a) {
int i;
for (i=0; i<5; i++) a[i]=0;
}
int f2(int *a) {
int i;
for (i=0; i<5; i++) if (a[i]!=0) return 0;
return 1;
}
void f1(int *a) {
int i;
for (i=0; i<5; i++) {
a[i]++;
if (a[i]<100) break;
a[i]-=100;
}
for (i=4; i>=0 && a[i]>=rex[i]; i--)
if (a[i]>rex[i])
f3(a);
}
void f4(int *a) {
int i;
for (i=0; i<5; i++) {
a[i]--;
if (a[i]>=0) break;
a[i]+=100;
}
if (i>=5) for (i=0; i<5; i++) a[i]=rex[i];
}
void f7(int *a, int *b) {
int c[5];
f3(c); f3(a);
while(!f2(b)) { f1(a); f4(b); f1(c); }
while(!f2(c)) { f1(b); f4(c); }
}
void f9(int *a, int *b) {
f1(a);
while(!f2(b)) { f4(b); f1(a); }
}
void f8(int *a, int *b) {
int c[5], d[5];
f7(d, a);
f3(a); f1(a);
while(!f2(b)) { f7(c, d); f9(a, c); f4(a); f4(b); }
}
void f5(int *a, int *b) {
int c[5], d[5];
f7(d, a);
f3(a); f1(a);
while(!f2(b)) { f7(c, d); f8(a, c); f4(a); f4(b); }
}
void f10(int x) {
int rpl[]=
{80, 125, 111, 18, 59, 88, 88, 28, 65, 98, 119, 103, 101, 79, 107, 2, 16,
92, 102, 123, 103, 84, 112, 78, 68, 98, 65, 37, 105, 85, 107, 13, 45, 9,
104, 81, 21, 31, 55, 110, 78, 66, 66, 3, 77, 63, 16, 105, 15, 123, 16, 84,
31, 96, 4, 82, 82, 122, 68, 115, 35, 73, 3, 108, 115, 83, 15, 19, 31, 99, 5,
123, 24, 65, 36, 15, 75, 84, 4, 2, -1};
int i;
int a[5], b[5], c[5];
if (x<100000000 || x>200000000) return;
x--;
f3(rex); rex[4]=1;
for (i=0; rpl[i]!=-1; i++)
{
f3(a); a[0]=i+1;
f3(b); f1(b); f3(c); f1(b); f1(b);
f1(c); f1(b); f5(a, b);
f1(c);
while(!f2(a))
{
f3(b); b[0]=x%100; b[1]=x/100;
f4(a); f8(c, b);
}
rpl[i]^=c[1];
printf("%c", rpl[i]);
}
printf("\n");
}
int main()
{
f10(123456789);
}
免责声明:AsukaNoKaze对本题题干一无所知,或知而不能改,是非AsukaNoKaze之过也。本故事纯属虚构,如有雷同,纯属诬蔑。
格式
输入格式
1或2或3或4。
输出格式
对于1你将输出用第一种改法改后的第一个程序。
对于2你将输出用第二种改法改后的第一个程序。
对于3你将输出用第三种改法改后的第一个程序。
第一第二第三按你所输出的字符串的ASCII码升序排列。
对于4,你将输出:
第一行:"LET'S SOLVE IT!"(没有引号)
第二行:第二个程序中123456789应改成的那个数;
第三行:输出的那个英文句子。
所有输出的行末均有回车,但没有多余空格。(请注意这一点,否则你的程序将被视为错误!)
样例1
样例输入1
这个题好像不需要样例吧。
样例输出1
给了你样例你就知道答案了~~~
限制
每点1s
但是 输出一点点字符大概不需要什么时间吧。