-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLittle Panda Power.cpp
136 lines (134 loc) · 3.17 KB
/
Little Panda Power.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
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<math.h>
using namespace std;
#define ll long long int
#define FOR(i,a,b) for(i= (int )a ; i < (int )b ; ++i)
#define rep(i,n) FOR(i,0,n)
#define INF INT_MAX
#define pb push_back
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define pi(n) printf("%d ",n)
#define pd(n) printf("%lf ",n)
#define pdl(n) printf("%lf\n",n)
#define pin(n) printf("%d\n",n)
#define pl(n) printf("%lld",n)
#define pln(n) printf("%lld\n",n)
#define si(n) scanf("%d",&n)
#define sl(n) scanf("%lld",&n)
#define scan(v,n) vector<int> v;rep(i,n){ int j;si(j);v.pb(j);}
#define mod (int)(1e9 + 7)
int isprime[1000006];
vector<int> primeit;
void seive()
{
int i,j;
int MAX=1000006;
isprime[0] = isprime[1] = 1;
for (i = 4; i < MAX; i += 2)
isprime[i] = 1;
for (i = 3; i * i < MAX; i += 2)
{
if (!isprime[i])
{
for (j = i * i; j < MAX; j += 2 * i)
{
isprime[j] = 1;
}
}
}
for(i=2;i<=MAX;i++)
if(!isprime[i])
primeit.pb(i);
}
ll gcd(ll a, ll b)
{
ll c;
while(a!=0)
{
c=a;
a=b%a;
b=c;
}
return b;
}
ll powerit(ll a, ll b, ll c)
{
ll x=1;
while(b!=0)
{
if(b&01==1)
{
x*=a;
if(x>=c)
x%=c;
}
a=a*a;
if(a>=c)
a%=c;
b>>=1;
}
return x;
}
int main()
{
int t,cnt;
ll a,b,c,sqrtit,calc1,calc2,calcit,b1,ansit,c4,c1;
//Finding all prime factors which will be required to compute phi(n)
seive();
si(t);
while(t--)
{
b1=1;
sl(a);
sl(b);
sl(c);
c1=c;
if(b<0)
{
cnt=0;
calc1=c;
calc2=1;
//Calculating phi(n)
//Using the formula phi(n)=n*(1-1/p1)*(1-1/p2)* ..... where pi refers to all prime divisors
sqrtit=sqrt(calc1);
sqrtit++;
//Finding all prime factors which is less than sqrt(n) and using the formula above
while(primeit[cnt]<=sqrtit)
{
calcit=primeit[cnt];
if(c%calcit==0)
{
calc1*=(calcit-1);
calc2*=calcit;
c4=gcd(calc1,calc2);
calc1/=c4;
calc2/=c4;
while(c%calcit==0)
c/=calcit;
}
cnt++;
}
if(c!=1 && isprime[c]==0)
{
calc1*=(c-1);
calc2*=c;
}
calc1/=calc2;
//phi(n) is calculated and stored in calc1
b1=calc1-1;
b=-b;
}
//To calculate ansit=A^(-1)%x using phi(x)
ansit=powerit(a,b1,c1);
//To calculate ansit=(ansit^b)%x
ansit=powerit(ansit,b,c1);
pln(ansit);
}
return 0;
}