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
#include<iostream>
#include<cstdio>
#include<cmath>
#define double long double
using namespace std;
int n;
char ch;
//const double N=33554432;
const double N=16;
const double eps=0.0001;
const double PI=3.1415926535897932384626433832795028841971693993751;
struct zesp{
    double re,im;
};
zesp p1,p2,podst,p3,h1,h2,podst2;
zesp dodaj(zesp a,zesp b){
    return {a.re+b.re,a.im+b.im};
}
zesp odejmij(zesp a,zesp b){
    return {a.re-b.re,a.im-b.im};
}
zesp mnoz(zesp a,zesp b){
    return {a.re*b.re-a.im * b.im,a.re*b.im+a.im*b.re};
}
zesp dziel(zesp a,zesp b){
    return{(a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im),(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im)};
}
zesp pot(zesp a,int b){
    if(b==0)return{1,0};
    if(b==1)return a;
    zesp wyn=pot(a,b/2);
    if(b%2==0)return mnoz(wyn,wyn);
    else return mnoz(wyn,mnoz(wyn,a));
}
inline void solve(){
    p1=mnoz(p1,podst);
    p2=mnoz(p2,podst2);
    p3={ch,0};
    h1=dodaj(h1,mnoz(p1,p3));
    h2=dodaj(h2,mnoz(p2,p3));
}
#ifdef _WIN32
#define getc_unlocked getc
#endif // _WIN32
inline void read(int *n){
    register char c = 0;
    while (c < 33) c=getc_unlocked(stdin);
    (*n) = 0;
    while (c>32) {(*n)=(*n)*10LL + (c-48); c=getc_unlocked(stdin);}
}
int main(){
    ios::sync_with_stdio(false);
    //cin>>n;
    read(&n);
    p1={1,0};
    p2={1,0};
    podst={cos(2.0*PI/N),sin(2.0*PI/N)};
    podst2={cos(-2.0*PI/N),sin(-2.0*PI/N)};
    if(n==0){
        ch=getchar();
        while(ch>='a'&&ch<='z'){
            ++n;
            solve();
            ch=getchar();
        }
    }
    else{
        ch=getchar();
        while(ch>='a'&&ch<='z'){
            solve();
            ch=getchar();
        }
    }
    h2=mnoz(h2,pot(podst,n+1));
    if(abs(h1.re-h2.re)<eps&&abs(h1.im-h2.im)<eps)cout<<"TAK";
    else cout<<"NIE";
}