#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
unsigned int* init () {
unsigned int *fib = malloc (sizeof(unsigned int) * 45);
fib[0]=0;
fib[1]=1;
fib[2]=1;
fib[3]=2;
fib[4]=3;
fib[5]=5;
fib[6]=8;
fib[7]=13;
fib[8]=21;
fib[9]=34;
fib[10]=55;
fib[11]=89;
fib[12]=144;
fib[13]=233;
fib[14]=377;
fib[15]=610;
fib[16]=987;
fib[17]=1597;
fib[18]=2584;
fib[19]=4181;
fib[20]=6765;
fib[21]=10946;
fib[22]=17711;
fib[23]=28657;
fib[24]=46368;
fib[25]=75025;
fib[26]=121393;
fib[27]=196418;
fib[28]=317811;
fib[29]=514229;
fib[30]=832040;
fib[31]=1346269;
fib[32]=2178309;
fib[33]=3524578;
fib[34]=5702887;
fib[35]=9227465;
fib[36]=14930352;
fib[37]=24157817;
fib[38]=39088169;
fib[39]=63245986;
fib[40]=102334155;
fib[41]=165580141;
fib[42]=267914296;
fib[43]=433494437;
fib[44]=701408733;
return fib;
}
char in (unsigned int x, unsigned int *a, char m) {
char mx=m;
char mn=0;
char mid;
while (mn < mx) {
mid = (mx+mn)/2;
if (x < a[mid]) {
mx = mid;
} else if (x > a[mid]) {
mn = (mx+mn+1)/2;;
} else {
return mid;
}
}
if (x == a[mn]) {
return mn;
} else {
return -1;
}
}
int main() {
unsigned int *arr = init();
char m;
unsigned int x;
unsigned int div;
unsigned int mod;
int t, i, j;
scanf("%d", &t);
for (i=0; i < t; i++) {
scanf("%u", &x);
if (in(x, arr, 44) >= 0) {
printf("TAK\n");
} else {
for (j=44; j > 2; j--) {
if (arr[j] > x) continue;
div = x / arr[j];
if (div <= 1) continue;
mod = x % arr[j];
if (mod > 0) continue;
if (in(div, arr, j) >= 0) {
printf("TAK\n");
break;
}
}
if (j == 2) printf("NIE\n");
}
}
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <stdio.h> #include <stdlib.h> #include <stdbool.h> unsigned int* init () { unsigned int *fib = malloc (sizeof(unsigned int) * 45); fib[0]=0; fib[1]=1; fib[2]=1; fib[3]=2; fib[4]=3; fib[5]=5; fib[6]=8; fib[7]=13; fib[8]=21; fib[9]=34; fib[10]=55; fib[11]=89; fib[12]=144; fib[13]=233; fib[14]=377; fib[15]=610; fib[16]=987; fib[17]=1597; fib[18]=2584; fib[19]=4181; fib[20]=6765; fib[21]=10946; fib[22]=17711; fib[23]=28657; fib[24]=46368; fib[25]=75025; fib[26]=121393; fib[27]=196418; fib[28]=317811; fib[29]=514229; fib[30]=832040; fib[31]=1346269; fib[32]=2178309; fib[33]=3524578; fib[34]=5702887; fib[35]=9227465; fib[36]=14930352; fib[37]=24157817; fib[38]=39088169; fib[39]=63245986; fib[40]=102334155; fib[41]=165580141; fib[42]=267914296; fib[43]=433494437; fib[44]=701408733; return fib; } char in (unsigned int x, unsigned int *a, char m) { char mx=m; char mn=0; char mid; while (mn < mx) { mid = (mx+mn)/2; if (x < a[mid]) { mx = mid; } else if (x > a[mid]) { mn = (mx+mn+1)/2;; } else { return mid; } } if (x == a[mn]) { return mn; } else { return -1; } } int main() { unsigned int *arr = init(); char m; unsigned int x; unsigned int div; unsigned int mod; int t, i, j; scanf("%d", &t); for (i=0; i < t; i++) { scanf("%u", &x); if (in(x, arr, 44) >= 0) { printf("TAK\n"); } else { for (j=44; j > 2; j--) { if (arr[j] > x) continue; div = x / arr[j]; if (div <= 1) continue; mod = x % arr[j]; if (mod > 0) continue; if (in(div, arr, j) >= 0) { printf("TAK\n"); break; } } if (j == 2) printf("NIE\n"); } } return 0; } |
English