/* File: 10006.cpp Author: ACboy Date: 2010-4-22 Result: AC Descripition: UVa 10006 Carmichael Numbers */ #include <iostream> using namespace std; int vis[70000]; // 快速幂取模(a^b % n) unsigned long ExpModula(unsigned long a, unsigned long b, unsigned long n) { unsigned long m = 1; while (b) { if (b & 1) { m = ((a % n) * (m % n)) % n; } b >>= 1; a = ((a % n) * (a % n)) % n; } return m; } // 素数刷法vis[i] == 0则表示i是素数,vis[i] == 1则表示i是合数。 void select_prime() { memset(vis, 0, sizeof(vis)); int i, j; for (i = 2; i <= 65000; i++) { if (!vis[i]) { for (j = i * 2; j <= 65000; j += i) { vis[j] = 1; } } } } int prime(int a) { int ok = 1; for (int i = 2; i * i <= a; i++) { if (a % i == 0) { ok = 0; break; } } return ok; } int main() { unsigned long n; #ifndef ONLINE_JUDGE freopen("10006.txt", "r", stdin); #endif select_prime(); while (cin >> n) { if (n == 0) break; if (!vis[n]) { printf("%d is normal./n", n); continue; } int ok = 1; for (unsigned long i = 2; i < n; i++) { if (ExpModula(i, n, n) != i) { ok = 0; break; } } if (ok) { printf("The number %d is a Carmichael number./n", n); } else { printf("%d is normal./n", n); } } return 0; }