【素数 && 快速幂】UVA - 10006 Carmichael Numbers

本文介绍了一种使用快速幂算法来判断一个合数是否为Carmichael数的方法。对于给定的非素数n,若对于所有小于n且大于1的整数x都满足(x^n)%n==x,则n为Carmichael数。文章提供了具体的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

输入一个数,如果这个数不是素数同时满足(x^n)%n == x其中(x > 1, x < n)

思路:

正常就x^n的次方,求n次,会超时,所以用快速幂。

#include<bits/stdc++.h>
using namespace std;
long long Pow(long long x, long long n, long long mod)//快速幂
{
    long long sum = 1;
    while(n)
    {
        if(n & 1) sum = (sum * x) % mod;
        x = (x * x) % mod;
        n = n>>1;
    }
    return sum;
}
int main()
{
    long long n;
    long long i;
    while(~scanf("%lld", &n) && n)
    {
        for(i = 2; i * i <= n; i++)
        {
            if(n % i == 0) break;
        }
        if(i * i <= n) {//不是素数
        for(i = 2; i < n; i++)
        {
            if(Pow(i, n, n) == i);
            else break;
        }
        if(i != n) printf("%lld is normal.\n", n);
        else printf("The number %lld is a Carmichael number.\n", n);
        }
        else printf("%lld is normal.\n", n);//是素数
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值