HDU 3388
题意:求与m, n 互质的第k 个整数。
思路:
AC代码:
#include <stdio.h>
#include <string.h>
const int N = 1005;
int phi[N * 10], vis[N * 10], m, n, a[N];
char M[15];
int pow_mod(int a,int n, int m)
{
if(n == 0) return 1;
int x = pow_mod(a,n>>1,m);
int ans = x*x%m;
if(n&1) ans = ans*a%m;
return ans;
}
int dfs(int i, int mod) {
if (i == n - 1) {
if (a[i] >= mod)
return a[i] % mod + mod;
return a[i];
}
int k = dfs(i + 1, phi[mod]);
return pow_mod(a[i], k, mod);
}
int main() {
for (int i = 1; i <= 10000; i++)
phi[i] = i;
for (int i = 2; i <= 10000; i++) {
if (vis[i]) continue;
for (int j = i; j <= 10000; j += i) {
phi[j] = phi[j] / i * (i - 1);
vis[j] = 1;
}
}
int cas = 0;
while (~scanf("%s", M) && M[0] != '#') {
sscanf(M, "%d", &m);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
printf("Case #%d: %d\n", ++cas, dfs(0, m) % m);
}
return 0;
}