forked from sitz/UVa-Online-Judge
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path10831.cpp
68 lines (66 loc) · 921 Bytes
/
10831.cpp
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
#include <bits/stdc++.h>
using namespace std;
#define int64 long long int
int64 GCD(int64 a, int64 b)
{
return (b == 0) ? a : GCD(b, a % b);
}
bool check(int64 p, int64 a)
{
/* if(p%2==0) return false;
for(int64 i=3;i*i<=p;i+=2)
if(p%i==0) return false;*/
if (GCD(p, a) != 1)
{
return false;
}
return true;
}
int64 mod(int64 base, int64 exp, int64 m)
{
if (exp == 0 || base == 0)
{
return 1;
}
else if (exp == 1)
{
return base % m;
}
else if (exp & 1)
{
return (mod(base, exp - 1, m) * base) % m;
}
else
{
int64 t = mod(base, exp / 2, m);
return (t * t) % m;
}
}
int64 a, p;
int main()
{
while (scanf("%lld %lld", &a, &p) == 2)
{
if (a == -1 && p == -1)
{
break;
}
a %= p;
if (check(p, a) || p < 3 || a == 0)
{
int64 s = mod(a, p / 2, p);
if (s == 1)
{
puts("Yes");
}
else
{
puts("No");
}
}
else
{
puts("No");
}
}
}