URAL_1007
按题目的要求依次检查各个可能出错的位置即可。
#include<stdio.h> #include<string.h> #define MAXD 1010 int N, M, A[MAXD], S; char b[MAXD]; void checkreplace() { int i, j, k; for(i = 0; i < M; i ++) if(b[i] == '1' && (S - i - 1) % (N + 1) == 0) { b[i] = '0'; printf("%s\n", b); return ; } } void checkremove() { int i, j, k; for(i = 0; i < M; i ++) { if((S + A[i]) % (N + 1) == 0) { for(j = 0; j < i; j ++) printf("%c", b[j]); printf("0"); for(j = i; j < M; j ++) printf("%c", b[j]); printf("\n"); return ; } if((S + A[i] + i + 1) % (N + 1) == 0) { for(j = 0; j < i; j ++) printf("%c", b[j]); printf("1"); for(j = i; j < M; j ++) printf("%c", b[j]); printf("\n"); return ; } } printf("%s", b); if(S % (N + 1) == 0) printf("0\n"); else printf("1\n"); } void checkinsert() { int i, j, k; for(i = 0; i < M; i ++) if((b[i] == '1' && (S - i - A[i]) % (N + 1) == 0) || (b[i] == '0' && (S - A[i]) % (N + 1) == 0)) { b[i] = '\0'; printf("%s", b); printf("%s\n", b + i + 1); return ; } } void solve() { int i, j, k; M = strlen(b); A[M] = S = 0; for(i = M - 1; i >= 0; i --) { A[i] = A[i + 1] + b[i] - '0'; if(b[i] == '1') S += i + 1; } if(N == M) { if(S % (N + 1) == 0) printf("%s\n", b); else checkreplace(); } else if(M < N) checkremove(); else checkinsert(); } int main() { scanf("%d", &N); while(scanf("%s", b) == 1) { solve(); } return 0; }