题目
#include <stdio.h>
#include <gmp.h>
#include <iostream>
#include<time.h>
#include<stdlib.h>
#define MAX 1<<16
using namespace std;
void expmod(mpz_t e, mpz_t m, mpz_t N, mpz_t b)
{
mpz_t i, r, result;
mpz_init(i); mpz_init(r); mpz_init(result);
mpz_set(i, e);
mpz_set_ui(result, 1);
while (mpz_cmp_ui(i, 1) != 0)
{
mpz_cdiv_r_ui(r, i, 2);
if (mpz_cmp_ui(r, 0) == 0)
{
mpz_mul(m, m, m);
mpz_cdiv_q_ui(i, i, 2);
}
else
{
mpz_mul(result, result, m);
mpz_sub_ui(i, i, 1);
}
mpz_mod(m, m, N);
mpz_mod(result, result, N);
}
mpz_mul(b, m, result);
mpz_mod(b, b, N);
}
int main()
{
int n;
cin >> n;
char temp[MAX];
mpz_t e, p, q;
mpz_init(e);
mpz_init(p);
mpz_init(q);
scanf("%s", temp);
mpz_set_str(p, temp, 10);
scanf("%s", temp);
mpz_set_str(q, temp, 10);
scanf("%s", temp);
mpz_set_str(e, temp, 10);
for (int i = 0; i < n; i++)
{
mpz_t c, result;
mpz_init(c);
mpz_init(result);
scanf("%s", temp);
mpz_set_str(c, temp, 10);
mpz_t yN, N, d, p1, q1;
mpz_init(yN);
mpz_init(N);
mpz_init(d);
mpz_init(p1);
mpz_init(q1);
mpz_sub_ui(p1, p, 1);
mpz_sub_ui(q1, q, 1);
mpz_mul(yN, p1, q1);
mpz_mul(N, p, q);
mpz_invert(d, e, yN);
expmod(d, c, N, result);
gmp_printf("%Zd\n", result);
mpz_clear(yN);
mpz_clear(N);
mpz_clear(d);
mpz_clear(p1);
mpz_clear(q1);
mpz_clear(result);
}
mpz_clear(e);
mpz_clear(p);
mpz_clear(q);
}