uva10006-Carmichael数

题目链接 http://acm.hust.edu.cn/vjudge/problem/19411

解题思路

快速幂, 筛法求素数。

代码

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
typedef long long ll;
using namespace std;
const int maxS = 65005;
bool isPrime[maxS];
ll PowMod(int a, int b, int c)
{
    ll result = 1;
    ll base = a % c;
    while(b) {
        if(b & 1) result = (result * base) % c;
        base = (base * base) % c;
        b = b >> 1;
    }
    return result;
}
int main()
{
    int flag, n, m;
    memset(isPrime, 1, sizeof(isPrime));
    isPrime[0] = isPrime[1] = false;
    m = sqrt(maxS) + 0.5;
    for(int i=2; i<m; i++) {
        if(isPrime[i]) {
            for(int j=i*i; j<maxS; j+=i)
                isPrime[j] = false;
        }
    }
    cin >> n;
    while(n) {
        flag = false;
        if(isPrime[n]) { cout <<  n << " is normal." << endl; cin >> n; continue; }
        for(int i=2; i<n; i++) if(PowMod(i, n, n) != i) {
            flag = true;
            break;
        }
        if(!flag) cout << "The number " << n << " is a Carmichael number." << endl;
        else cout <<  n << " is normal." << endl;
        cin >> n;
    }
    return 0;
}
时间: 2025-01-01 20:59:44

uva10006-Carmichael数的相关文章

UVA10006 - Carmichael Numbers(筛选构造素数表+快速幂)

UVA10006 - Carmichael Numbers(筛选构造素数表+快速幂) 题目链接 题目大意:如果有一个合数,然后它满足任意大于1小于n的整数a, 满足a^n%n = a;这样的合数叫做Carmichael Numbers.题目给你n,然你判断是不是Carmichael Numbers. 解题思路:首先用筛选法构造素数表,判断n是否是合数,然后在用快速幂求a^2-a^(n - 1)是否满足上述的式子.快速幂的时候最好用long long ,防止相乘溢出. 代码: #include <

大数质因解:浅谈Miller-Rabin和Pollard-Rho算法

2017-07-19 08:54 Amphetamine:能发一下代码吗? 应我那位谜一样好友的邀约,我打算好好看一看Miller-Rabin和Pollard-Rho算法.很奇怪,各种地方有很多代码描述详细过程,但我仍旧很懵.也许是我太弱了,不能从那些“鱼龙混杂”的代码中找出本质上的共性.那么,我们现在来讨论一下吧. 首先,大整数分解现在仍然是个世界级的难题,在“公共密钥”的研究上有着重要的作用. !!先判断质数!! 试除法:原始的根号算法 额.不想说了.正经一点. Miller-Rabin:判

素数检测杂谈

最开始我们学到的是这种朴素的写法: (define (prime? n) (cond [(or (= n 2) (= n 3)) #t] [(even? n) #f] [else (prime-test-loop n)])) (define (prime-test-loop n) (let ((top (ceiling (sqrt n)))) (let iter ((start 3)) (cond [(> start top) #t] [(= (mod n start) 0) #f] [else

bzoj4802 欧拉函数(附Millar-Rabin和Pollard-Rho讲解)

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4802 [题解] 参考:http://www.matrix67.com/blog/archives/234 Millar-Rabin质数检验方法: 根据费马小定理,如果p是素数,a<p,那么有a^(p-1) mod p = 1. 直观想法我们直接取若干个a,如果都有一个不满足,那么p就是合数. 遗憾的是,存在Carmichael数:你无论取多少个a,有一个不满足,算我输. 比如:561 =

Miller-Rabin素数快速检测

满足费马小定理 a^(n-1) === 1(mod n) --->伪素数       对于所有a belong Zn*,总存在满足的合数n,称为Carmichael数 ---------------------------------- [Miller-Rabin]: 1.随机找多个s个a 2.二次探测定理: 如果p是奇素数,则 x2 === 1(mod p)的解为 x = 1 || x = p - 1(mod p)    {如:5的话,1或4} //Miller-Rabin //n prime

HDU2138 随机素数测试 Miller-Rabin算法

题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be

数论部分第一节:素数与素性测试【详解】

数论部分第一节:素数与素性测试 一个数是素数(也叫质数),当且仅当它的约数只有两个——1和它本身.规定这两个约数不能相同,因此1不是素数.对素数的研究属于数论范畴,你可以看到许多数学家没事就想出一些符合某种性质的素数并称它为某某某素数.整个数论几乎就围绕着整除和素数之类的词转过去转过来.对于写代码的人来说,素数比想像中的更重要,Google一下BigPrime或者big_prime你总会发现大堆大堆用到了素数常量的程序代码.平时没事时可以记一些素数下来以备急用.我会选一些好记的素数,比如4567

数论随记(二)

HDU1573 /*中国剩余定理*/ 10. 公式 1. ab(mod m) (a mod m) b (mod m) (化简); HDU1395 (2^x 1(mod n) 2^x%n 1(mod n) ) 2. xa(mod m) x*ka*k(mod m); 3. xn-a(mod m) x+an(mod m); HDU1788 4. gcd(a,b)=k gcd(a/k,b/k)=1; 5. a%k= (变型: %k= ) HDU1852 如果m与k互素,则(a/m)%k=a*m^(phi

素数 专题

素数性质总结: 小于x的素数个数(随着x逐渐增大),与x/lnx近似: 素数测试方法,诶拉托色尼筛法:如果n是一个合数,那么n一定有一个不超过sqrt(n)的素因子:6N±1法:对于任何一个自然数,都可以表示为如下形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5(N=0,1,2,3...)显然,当N>=1时,只有形如6N+1,6N+5的自然数有可能是素数(代码后面贴上) n!的素因子分解中的素数p的幂为 n/p+n/p2+n/p3+...... 梅森素数:如果m是一个正整数,且2

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考