#include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned long long ulong_t; typedef unsigned long long uint_t; #define max_input_pow 201740 void upate_single_power(uint_t* arr) { if(arr[0] >= 2) { uint_t val = arr[0] >> 1; arr[1] += val; arr[0] -= val << 1; } } ulong_t process_input(ulong_t n, uint_t* arr, size_t arr_size) { int i = 0; for(i = 0; i < arr_size; i++) { upate_single_power(&(arr[i])); } i = arr_size - 1; while(arr[i] == 0) { i--; } return i; } char* get_next_num(const char* input, uint_t *val) { char arr[21]; int i = 0; char c; c = input[i]; while(c >= '0' && c <= '9') { arr[i] = c; i++; c = input[i]; } arr[i] = '\0'; *val = atoi(arr); if(c == '\0') { return NULL; } else { return input + i + 1; } } void insert_powers(const char* line, uint_t* arr, size_t arr_len) { char *c = line; uint_t val = 0; while(NULL != c) { c = get_next_num(c, &val); arr[val] ++; } } int main(int argc,char* argv[]) { char* str = malloc(7000010); memset(str, 0, 700010); int no = 0; gets(str); get_next_num(str, &no); int i = 0; uint_t input[max_input_pow] = {0}; memset(str, 0, 700010); gets(str); insert_powers(str, input, max_input_pow); printf("%lu", process_input(no, input, max_input_pow)); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned long long ulong_t; typedef unsigned long long uint_t; #define max_input_pow 201740 void upate_single_power(uint_t* arr) { if(arr[0] >= 2) { uint_t val = arr[0] >> 1; arr[1] += val; arr[0] -= val << 1; } } ulong_t process_input(ulong_t n, uint_t* arr, size_t arr_size) { int i = 0; for(i = 0; i < arr_size; i++) { upate_single_power(&(arr[i])); } i = arr_size - 1; while(arr[i] == 0) { i--; } return i; } char* get_next_num(const char* input, uint_t *val) { char arr[21]; int i = 0; char c; c = input[i]; while(c >= '0' && c <= '9') { arr[i] = c; i++; c = input[i]; } arr[i] = '\0'; *val = atoi(arr); if(c == '\0') { return NULL; } else { return input + i + 1; } } void insert_powers(const char* line, uint_t* arr, size_t arr_len) { char *c = line; uint_t val = 0; while(NULL != c) { c = get_next_num(c, &val); arr[val] ++; } } int main(int argc,char* argv[]) { char* str = malloc(7000010); memset(str, 0, 700010); int no = 0; gets(str); get_next_num(str, &no); int i = 0; uint_t input[max_input_pow] = {0}; memset(str, 0, 700010); gets(str); insert_powers(str, input, max_input_pow); printf("%lu", process_input(no, input, max_input_pow)); return 0; } |