import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class OldSolution {
static long a, n, m, base10, base10n, base10Mod, rPowN;
static long totient;
static Map
<Long, Long
> reuseTotients
= new HashMap
<>(); static List<Long> primes = new ArrayList<>();
public static long gcd(long a, long b) {
if (a == 0)
return b;
return gcd(b % a, a);
}
public static boolean testPrime(long t) {
long tsqrt
= (long) Math.
sqrt(t
); long prime;
for (int i = 0; i < primes.size(); ++i) {
prime = primes.get(i);
if (prime > tsqrt) {
break;
}
if (t % prime == 0) {
return false;
}
}
return true;
}
public static void calcPrimes(long n) {
long lastPrime = primes.get(primes.size() - 1);
long i = lastPrime / 6 + 1;
long a, b;
if (lastPrime % 6 == 5) {
if (testPrime(6 * i + 1)) {
primes.add(6 * i + 1);
}
i++;
}
while (true) {
a = 6 * i - 1;
b = 6 * i + 1;
if (testPrime(a)) {
primes.add(a);
}
if (testPrime(b)) {
primes.add(b);
}
if (b > n) {
break;
}
i++;
}
}
public static void calcTotient() {
if (reuseTotients.containsKey(m)) {
totient = reuseTotients.get(m);
}
if (primes.get(primes.size() - 1) < m) {
calcPrimes(m);
}
int i = 0;
for (; primes.get(i) < m; ++i) ;
totient = i;
reuseTotients.put(m, totient);
}
public static void getBase10() {
//use a
long a1 = a;
long t = 0;
base10 = 1;
while (a1 > 0) {
a1 /= 10;
t++;
base10 *= 10;
}
base10n = t;
}
public static long calcRpowN(long n1) {
if (base10Mod == 1) {
return 1;
}
long rPowN = 1;
long temp = base10Mod;
long i = 1;
while (n1 != 0) {
if ((n1 & i) != 0) {
rPowN = (rPowN * temp) % m;
n1 ^= i; //unset ith bit
}
i <<= 1;
temp = ((temp * temp) % m);
}
return rPowN;
}
public static void calcBase10Mod() {
getBase10();
//calc base10mod first
base10Mod = base10 % m;
if (base10Mod == 1) {
return;
}
// calc rPowN
// to use euclid's method, we need 10^t and m to be coprimes
if (m % 5 != 0 && m % 2 != 0) {
//co prime here
calcTotient();
long n1 = n % totient;
rPowN = calcRpowN(n1);
} else {
rPowN = calcRpowN(n);
}
}
public static long modInverseFast(long a, long m) {
long m0 = m, temp, q;
long x0 = 0, x1 = 1;
if (m == 1)
return 0;
while (a > 1) {
// floor it
q = a / m;
temp = m;
m = a % m;
a = temp;
temp = x0;
x0 = x1 - q * x0;
x1 = temp;
}
// Make x1 positive
if (x1 < 0)
x1 += m0;
return x1;
}
public static long getMultiModInverse(long x, long m) {
if (gcd(x, m) == 1) {
return modInverseFast(x, m);
}
x = x % m;
for (long i = 1; i < m; ++i) {
if ((x * i) % m == 1)
return i;
}
return -1;
}
primes.add(2l);
primes.add(3l);
primes.add(5l);
long ans;
final StringBuilder stringBuilder = new StringBuilder();
for (int t
= Integer.
parseInt(br.
readLine()); t
> 0; t
--) { final String split
[] = br.
readLine().
split(" "); a
= Long.
parseLong(split
[0]); n
= Long.
parseLong(split
[1]); m
= Long.
parseLong(split
[2]);
calcBase10Mod();
if (base10Mod == 1) {
ans = ((a % m) * (n % m)) % m;
stringBuilder.append(ans).append('\n');
continue;
}
long numer = (rPowN - 1 + m) % m;
numer = (numer * (a % m)) % m;
// calc r-1 mod m
long denInverse = getMultiModInverse(base10 - 1, m);
ans = (numer * denInverse) % m;
stringBuilder.append(ans).append('\n');
}
System.
out.
println(stringBuilder
);
}
}