uva10692-지수 순환절

1508 단어
제목 링크:https://vjudge.net/problem/UVA-10692
a1^(a2^(a3^(...^ an)))%m의 값을 구하다
지수 순환절의 강멱 공식 a^b%mod = a^(b^phi(mod)+phi(mod))%mod를 차례로 계산하면 되고phi()는 오라 함수로 미리 처리할 수 있습니다
코드:
# include 
# include 
# include 
# include 
# include 
using namespace std;
typedef long long LL;
const int maxn = 10 + 5;
const int maxm = 1e4 + 5;
char s[maxn];
int a[maxn];
int phi[maxm];
int m, n;

int fast_pow(int x, int n, int mod) {
    int r = 1;
    while (n) {
        if (n & 1) r = (LL)r * x % mod;
        x = (LL)x * x % mod;
        n >>= 1;
    }
    return r;
}

void phi_table() {
    memset(phi, 0, sizeof phi);
    phi[1] = 1;
    for (int i = 2; i < maxm; ++i) if (!phi[i])
        for (int j = i; j < maxm; j += i) {
            if (!phi[j]) phi[j] = j;
            phi[j] = phi[j] / i * (i - 1);
        }
}

int solve(int id, int mod) {
    if (id == n - 1) return a[id] % mod;
    else return fast_pow(a[id], solve(id + 1, phi[mod]) + phi[mod], mod) % mod;
}

int main(void)
{
    phi_table();
    int Case = 0;
    while (scanf("%s", s) == 1 && strcmp(s, "#")) {
        sscanf(s, "%d", &m);
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) scanf("%d", a + i);
        printf("Case #%d: %d
", ++Case, solve(0, m)); } return 0; } /* 10 4 2 3 4 5 100 2 5 2 53 3 2 3 2 # */

좋은 웹페이지 즐겨찾기