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
#include <iostream>
#include <set>
#include <math.h>
#include <string>

//#include <conio.h>

#define UIL unsigned long long
#define UI  unsigned int

class prime 
{
private:
	std::set<UIL> primals;
public:
	void init(UIL max)
	{
		//dodanie pierwszych liczb pierwszych (XD)
		primals.insert(2);
		primals.insert(3);
		primals.insert(5);
		primals.insert(7);
		primals.insert(11);
		primals.insert(13);
		//a teraz można zacząć wyliczać
		for (UIL i = 14; i <= max; i++)
		{
			bool isPrim = false;
			for (auto v : primals) //sprawdzanie podzielności
			{
				if (i%v == 0)
				{
					isPrim = true;
					break;
				}
			}
			if(!isPrim)
				primals.insert(i);
		}
	}
	void print()
	{
		for (auto v : primals)
			std::cout << v << ' ';
	}
	bool isPrime(UIL x)
	{
		return primals.find(x) != primals.end();
	}
};


int main()
{
	prime Prime;
	UIL n;
	std::cin >> n;
	UI dz = pow(10, std::to_string(n).length()-1);
	bool iCierpienie = false;
	Prime.init(n / 2);
	for (UI i = 0; i < std::to_string(n).length()-1; i++)
	{
		UIL a = n / dz;
		UIL b = n % dz;
		auto ddd = std::stoull(std::to_string(a) + std::to_string(b));
		if (ddd<n)
			continue;
		//std::cout << a << ' ' << b << std::endl;

		if (Prime.isPrime(a) && Prime.isPrime(b))
		{
			iCierpienie = true;
			break;
		}
		dz /= 10;
		
	}
	if (iCierpienie)
		std::cout << "TAK";
	else
		std::cout << "NIE";

	//a.init(1000);
	//a.print();
	//std::cout << a.isPrime(99);

	//std::cout << n << ' ' << dz;

	//_getch();

	return 0;
}