//Łukasz Proksa
//Silesian University of Technology, Poland
//Contest: Potyczki Algorytmiczne 2014
//Task: Iloczyn (trial)
//Solved! O(44*t)
#include <cstdio>
#include <math.h>
using namespace std;
#define FOR(i, p, k) for(int i = (p); i < (k); i++)
const int MAX_N = 1000000000; //10^9
int t, n;
int fib[23]; //22 liczby
void init();
bool daSie(int n) {
int i = 0;
int j = 21;
int sq = floor(sqrt(n));
//printf("%d\n",sq);
while(fib[i] <= sq && i < 22) { //amortyzowany koszt O(2*22)
//printf("sprawdzam %d\n", fib[i]);
if(n % fib[i] == 0) { //fib[i] dzieli
int r = n / fib[i];
//printf("dzieli, czy dzielnik %d jest fib? ", r);
while(fib[j] > r) { //r >= 1
//printf("fib[j]: %d\n", fib[j]);
j--;
}
if(fib[j] == r) { //czy dzielnik jest fib
//printf("tak\n");
return true;
}
//printf("nie\n");
}
i++;
}
return false;
}
int main() {
init();
//printf("%d %d %d %d\n", fib[0], fib[43], fib[1], fib[5]);
scanf("%d", &t);
FOR(i, 0, t) {
scanf("%d", &n);
if(daSie(n)) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}
void init() {
fib[0]=1; fib[1]=2; fib[2]=3; fib[3]=5; fib[4]=8;
fib[5]=13; fib[6]=21; fib[7]=34; fib[8]=55; fib[9]=89;
fib[10]=144; fib[11]=233; fib[12]=377; fib[13]=610; fib[14]=987;
fib[15]=1597; fib[16]=2584; fib[17]=4181; fib[18]=6765; fib[19]=10946;
fib[20]=17711; fib[21]=28657;
}
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 | //Łukasz Proksa //Silesian University of Technology, Poland //Contest: Potyczki Algorytmiczne 2014 //Task: Iloczyn (trial) //Solved! O(44*t) #include <cstdio> #include <math.h> using namespace std; #define FOR(i, p, k) for(int i = (p); i < (k); i++) const int MAX_N = 1000000000; //10^9 int t, n; int fib[23]; //22 liczby void init(); bool daSie(int n) { int i = 0; int j = 21; int sq = floor(sqrt(n)); //printf("%d\n",sq); while(fib[i] <= sq && i < 22) { //amortyzowany koszt O(2*22) //printf("sprawdzam %d\n", fib[i]); if(n % fib[i] == 0) { //fib[i] dzieli int r = n / fib[i]; //printf("dzieli, czy dzielnik %d jest fib? ", r); while(fib[j] > r) { //r >= 1 //printf("fib[j]: %d\n", fib[j]); j--; } if(fib[j] == r) { //czy dzielnik jest fib //printf("tak\n"); return true; } //printf("nie\n"); } i++; } return false; } int main() { init(); //printf("%d %d %d %d\n", fib[0], fib[43], fib[1], fib[5]); scanf("%d", &t); FOR(i, 0, t) { scanf("%d", &n); if(daSie(n)) printf("TAK\n"); else printf("NIE\n"); } return 0; } void init() { fib[0]=1; fib[1]=2; fib[2]=3; fib[3]=5; fib[4]=8; fib[5]=13; fib[6]=21; fib[7]=34; fib[8]=55; fib[9]=89; fib[10]=144; fib[11]=233; fib[12]=377; fib[13]=610; fib[14]=987; fib[15]=1597; fib[16]=2584; fib[17]=4181; fib[18]=6765; fib[19]=10946; fib[20]=17711; fib[21]=28657; } |
English