一年一度的厦门大学ACM竞赛又开始了,今年已经是第九届了。在这儿,YT要和大家玩一个关于数字九的游戏,游戏很简单,YT在心中想出一个两位以上(含两位)的正整数A,然后求出从1到A的和sumA,将sumA模上9得到n;YT去掉A的某一位上的数,得到一个新数字B,然后求出从1到B的和sumB,将sumB模上9得到m。现在已知n和m,您能告诉YT去掉位上的数字是多少么?
一年一度的厦门大学ACM竞赛又开始了,今年已经是第九届了。在这儿,YT要和大家玩一个关于数字九的游戏,游戏很简单,YT在心中想出一个两位以上(含两位)的正整数A,然后求出从1到A的和sumA,将sumA模上9得到n;YT去掉A的某一位上的数,得到一个新数字B,然后求出从1到B的和sumB,将sumB模上9得到m。现在已知n和m,您能告诉YT去掉位上的数字是多少么?
第一行一个数字C(C<=10000),表示输入数据组数
从第二行开始每行两个数字 n,m(0=<n,m<9),分别为sumA、sumB模上9的值。
根据输入的n,m请告诉YT去掉位上的数字的值,若有多个可能值,请按从小到大的顺序输出所有可能值;若不存在这样的值,请输出“Poor YT, your calculation is wrong.”(不包括引号)。
2
0 0
0 2
0 1 8 9
Poor YT, your calculation is wrong.
思路 暴力求出以后打表
暴力打表代码:
#include<stdio.h> #include<string.h> #define max 100000 //太大会溢出 int a[max]; struct haha { int a[10]; }map[10][10]; int sum[max]; void get_sum() { int i; sum[0]=0; for(i=1;i<max;i++) sum[i]=sum[i-1]+i; } int main() { //freopen("c://out.txt","w",stdout); int n,m,i,j,k,num,d,c1,c2; char s[20],s2[20]; get_sum(); for(i=0;i<10;i++) for(j=0;j<10;j++) for(k=0;k<10;k++) map[i][j].a[k]=0; for(i=10;i<=100000;i++) {//i=12345; n=sum[i]%9; sprintf(s,"%d",i); d=strlen(s); for(j=0;j<d;j++) { c1=0; for(k=0;k<d;k++) { if(k!=j) s2[c1++]=s[k]; } s2[c1]='\0'; sscanf(s2,"%d",&num); //printf("num=%d\n",num); m=sum[num]%9; map[n][m].a[s[j]-'0']=1; } } for(i=0;i<10;i++) for(j=0;j<10;j++) { int k; printf("%d %d:",i,j); for(k=0;k<10;k++) if(map[i][j].a[k]) printf("%d ",k); printf("\n"); } return 0; }
0 0:0 1 8 9
0 1:1 2 4 5 7 8
0 2:
0 3:2 3 6 7
0 4:
0 5:
0 6:3 4 5 6
0 7:
0 8:
0 9:
1 0:1 2 4 5 7 8
1 1:0 3 6 9
1 2:
1 3:1 2 4 5 7 8
1 4:
1 5:
1 6:1 2 4 5 7 8
1 7:
1 8:
1 9:
2 0:
2 1:
2 2:
2 3:
2 4:
2 5:
2 6:
2 7:
2 8:
2 9:
3 0:2 3 6 7
3 1:1 2 4 5 7 8
3 2:
3 3:0 4 5 9
3 4:
3 5:
3 6:1 3 6 8
3 7:
3 8:
3 9:
4 0:
4 1:
4 2:
4 3:
4 4:
4 5:
4 6:
4 7:
4 8:
4 9:
5 0:
5 1:
5 2:
5 3:
5 4:
5 5:
5 6:
5 7:
5 8:
5 9:
6 0:3 4 5 6
6 1:1 2 4 5 7 8
6 2:
6 3:1 3 6 8
6 4:
6 5:
6 6:0 2 7 9
6 7:
6 8:
6 9:
7 0:
7 1:
7 2:
7 3:
7 4:
7 5:
7 6:
7 7:
7 8:
7 9:
8 0:
8 1:
8 2:
8 3:
8 4:
8 5:
8 6:
8 7:
8 8:
8 9:
9 0:
9 1:
9 2:
9 3:
9 4:
9 5:
9 6:
AC代码
#include<stdio.h> struct haha { int a[10]; int cnt; }map[10][10]; void get() { int i,j,k; for(i=0;i<10;i++) for(j=0;j<10;j++) map[i][j].cnt=0; map[0][0].a[0]=0;map[0][0].a[1]=1;map[0][0].a[2]=8;map[0][0].a[3]=9; map[0][0].cnt=4; map[0][1].a[0]=1;map[0][1].a[1]=2;map[0][1].a[2]=4;map[0][1].a[3]=5;map[0][1].a[4]=7;map[0][1].a[5]=8; map[0][1].cnt=6; map[0][3].a[0]=2;map[0][3].a[1]=3;map[0][3].a[2]=6;map[0][3].a[3]=7; map[0][3].cnt=4; map[0][6].a[0]=3;map[0][6].a[1]=4;map[0][6].a[2]=5;map[0][6].a[3]=6; map[0][6].cnt=4; map[1][0].a[0]=1;map[1][0].a[1]=2;map[1][0].a[2]=4;map[1][0].a[3]=5;map[1][0].a[4]=7;map[1][0].a[5]=8; map[1][0].cnt=6; map[1][1].a[0]=0;map[1][1].a[1]=3;map[1][1].a[2]=6;map[1][1].a[3]=9; map[1][1].cnt=4; map[1][3].a[0]=1;map[1][3].a[1]=2;map[1][3].a[2]=4;map[1][3].a[3]=5;map[1][3].a[4]=7;map[1][3].a[5]=8; map[1][3].cnt=6; map[1][6].a[0]=1;map[1][6].a[1]=2;map[1][6].a[2]=4;map[1][6].a[3]=5;map[1][6].a[4]=7;map[1][6].a[5]=8; map[1][6].cnt=6; map[3][0].a[0]=2;map[3][0].a[1]=3;map[3][0].a[2]=6;map[3][0].a[3]=7; map[3][0].cnt=4; map[3][1].a[0]=1;map[3][1].a[1]=2;map[3][1].a[2]=4;map[3][1].a[3]=5;map[3][1].a[4]=7;map[3][1].a[5]=8; map[3][1].cnt=6; map[3][3].a[0]=0;map[3][3].a[1]=4;map[3][3].a[2]=5;map[3][3].a[3]=9; map[3][3].cnt=4; map[3][6].a[0]=1;map[3][6].a[1]=3;map[3][6].a[2]=6;map[3][6].a[3]=8; map[3][6].cnt=4; map[6][0].a[0]=3;map[6][0].a[1]=4;map[6][0].a[2]=5;map[6][0].a[3]=6; map[6][0].cnt=4; map[6][1].a[0]=1;map[6][1].a[1]=2;map[6][1].a[2]=4;map[6][1].a[3]=5;map[6][1].a[4]=7;map[6][1].a[5]=8; map[6][1].cnt=6; map[6][3].a[0]=1;map[6][3].a[1]=3;map[6][3].a[2]=6;map[6][3].a[3]=8; map[6][3].cnt=4; map[6][6].a[0]=0;map[6][6].a[1]=2;map[6][6].a[2]=7;map[6][6].a[3]=9; map[6][6].cnt=4; } int main() { int n,m,cas,i; get(); scanf("%d",&cas); while(cas--) { scanf("%d %d",&n,&m); if(map[n][m].cnt==0) printf("Poor YT, your calculation is wrong.\n"); else { for(i=0;i<map[n][m].cnt-1;i++) printf("%d ",map[n][m].a[i]); printf("%d\n",map[n][m].a[i]); } } return 0; }