快速幂运算---反复平方法
* [题意]
* 输入n,若满足如下两个条件,则n是Carmichael number
* 1、n不是素数
* 2、对于所有a(2<=a<n),有(a^n)%n = a
*
* [解题方法]
* 快速幂取模,注意运算过程中的乘法溢出int
*/
#include <cstdio>
using namespace std;
typedef long long ll;
bool is_prime(ll x)
{
for (int i = 2; i * i <= x; i++){
if (x % i == 0)
return 0;
}
return 1;
}
ll mod_pow(ll x, ll n, ll mod)
{
ll res = 1;
while (n > 0){
if (n & 1)
res = res * x % mod; //如果二进制最低位为1,则乘上x^(2^i)
x = x * x % mod; //将x平方
n >>= 1;
}
return res;
}
int main()
{
ll n;
while (scanf("%lld", &n), n){
bool flag = 1;
if (is_prime(n))
flag = 0;
for (int i = 2; i < n && flag; i++){
if (mod_pow(i, n, n) != i)
flag = 0;
}
if (flag)
printf("The number %d is a Carmichael number.\n", n);
else
printf("%d is normal.\n", n);
}
return 0;
}
#include <cstdio>
using namespace std;
typedef long long ll;
bool is_prime(ll x)
{
for (int i = 2; i * i <= x; i++){
if (x % i == 0)
return 0;
}
return 1;
}
ll mod_pow(ll x, ll n, ll mod)
{
if (n == 0)
return 1;
ll res = mod_pow(x * x % mod, n / 2, mod);
if (n & 1)
res = res * x % mod;
return res;
}
int main()
{
ll n;
while (scanf("%lld", &n), n){
bool flag = 1;
if (is_prime(n))
flag = 0;
for (int i = 2; i < n && flag; i++){
if (mod_pow(i, n, n) != i)
flag = 0;
}
if (flag)
printf("The number %d is a Carmichael number.\n", n);
else
printf("%d is normal.\n", n);
}
return 0;
}