hnpsolve.c (1727B)
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <flint.h> 4 #include <fmpz_vec.h> 5 #include <hnp.h> 6 7 #define LINE_SIZE_MAX 4096 8 9 static int read_next_fmpz(fmpz_t res) 10 { 11 char buffer[LINE_SIZE_MAX]; 12 size_t i; 13 14 int next_char = getchar(); 15 while(next_char == '\n' || next_char == ' ') 16 next_char = getchar(); 17 18 if(next_char == EOF) 19 return -1; 20 21 buffer[0] = next_char; 22 i = 1; 23 while(i < LINE_SIZE_MAX-1) { 24 next_char = getchar(); 25 if(next_char == EOF || next_char == '\n' || next_char == ' ') 26 break; 27 28 buffer[i] = (char) next_char; 29 30 i++; 31 } 32 buffer[i] = '\0'; 33 34 return fmpz_set_str(res, buffer, 10); 35 } 36 37 static int read_stdin_instance(fmpz** a, fmpz** t, slong* m, fmpz_t* B, fmpz_t* n) 38 { 39 flint_scanf("%wd", m); 40 41 if(read_next_fmpz(*B)) 42 return -1; 43 44 if(read_next_fmpz(*n)) 45 return -1; 46 47 *a = _fmpz_vec_init(*m); 48 *t = _fmpz_vec_init(*m); 49 50 51 slong i; 52 int fail = 0; 53 for(i = 0; i < *m; i++) { 54 if(read_next_fmpz(&(*t)[i])) { 55 fail = 1; 56 break; 57 } 58 59 if(read_next_fmpz(&(*a)[i])) { 60 fail = 1; 61 break; 62 } 63 } 64 65 if(fail) { 66 _fmpz_vec_clear(*a, *m); 67 _fmpz_vec_clear(*t, *m); 68 return -1; 69 } 70 71 return 0; 72 } 73 74 int main(int argc, char* argv[]) 75 { 76 slong m; 77 fmpz* a; 78 fmpz* t; 79 fmpz_t B, n; 80 fmpz_init(B); 81 fmpz_init(n); 82 83 if(read_stdin_instance(&a, &t, &m, &B, &n) != 0) { 84 fprintf(stderr, "ERROR! Bad input format?\n"); 85 exit(1); 86 } 87 88 fmpz res[m+1]; 89 slong i; 90 for(i = 0; i < m+1; i++) fmpz_init(&res[i]); 91 92 int ret = hidden_number_problem(res, m+1, t, a, m, n, B); 93 if(ret == 0) { 94 for(i = 0; i < m; i++) { 95 fmpz_print(&res[i]); 96 printf(" "); 97 } 98 fmpz_print(&res[m]); 99 printf("\n"); 100 } 101 102 return 0; 103 }