#include #include int M = 0; int N = 1; int len = 0; int *A = NULL; int *seqIdx = NULL; int seqLen = 0; int sum = 0; int inSeq(int x); // Return true, if x in subsequence void sortSeq(void); int main(void) { FILE *f, *g; int i; f = fopen("input.txt", "r"); if (f == NULL) { return -1; } if ( fscanf(f, "%d%d%d", &M, &N, &len) < 3 || N == 0 ) { fclose(f); return -1; } A = (int *) malloc(len*sizeof(int)); seqIdx = (int *) malloc(len*sizeof(int)); sum = 0; for (i = 0; i < len; ++i) { if (fscanf(f, "%d", A + i) < 1) { fclose(f); free(A); free(seqIdx); return -1; } sum += A[i]; } fclose(f); seqLen = 0; for (i = 0; i < len; ++i) { if (inSeq(A[i])) { seqIdx[seqLen] = i; ++seqLen; } } sortSeq(); g = fopen("output.txt", "w"); if (g == NULL) { free(A); free(seqIdx); return -1; } for (i = 0; i < len; ++i) { fprintf(g, "%d ", A[i]); } fprintf(g, "\n"); fclose(g); free(A); free(seqIdx); return 0; } int inSeq(int x) { int chislitel, znamenatel; int mm = M; int nn = N; // Denominator of the M/N fraction must be positive if (nn < 0) { mm = (-mm); nn = (-nn); } // |x - sum/len| <= mm/nn chislitel = x*len - sum; znamenatel = len; if (chislitel < 0) { // absolute value of the fraction chislitel = (-chislitel); } // Fraction |x - sum/len| = chislitel/znamenatel; // chislitel/znamenatel <= mm/nn <==> // chilsitel*nn <= znamenatel*mm return (chislitel*nn <= znamenatel*mm); } void sortSeq(void) { // The simple bubble sort int i; int invers = 1; // true while (invers) { invers = 0; // false for (i = 0; i < seqLen - 1; ++i) { if (A[seqIdx[i]] > A[seqIdx[i+1]]) { // swap elements int tmp = A[seqIdx[i]]; A[seqIdx[i]] = A[seqIdx[i+1]]; A[seqIdx[i+1]] = tmp; invers = 1; // true } } } }