uva10006(幂取模)

来源:互联网 发布:你也配做姓赵 知乎 编辑:程序博客网 时间:2024/05/24 03:23

题目的意思就是要求找出n 满足一下两个条件

1. n不是素数 .

2.对于任何比n小的数a 都有 pow (a , n) % n ==  a;

首先判断是不是素数.

然后用幂取模遍历所有小于n的a来求是不是满足第二个条件就行了.


AC代码:


#include<stdio.h>#include<math.h>int num;int pow_mod(int a ,int  n ,int  m) {if(n == 1)return a;int x = pow_mod(a , n / 2 , m);long long ans = (long long) x * x % m;if(n % 2 == 1)ans = ans * a % m;return (int)ans;}int main () {int num;while(scanf("%d",&num) && num) {bool flag = false;for (int i = 2 ; i < sqrt(num) ; i++) {if(num % i == 0) {flag = true;break;}}if(!flag) {printf("%d is normal.\n",num);continue;}flag = false;for (int i = 1 ; i < num ;i++) {if(pow_mod(i , num , num) != i) {flag = true;break;}}if(!flag)printf("The number %d is a Carmichael number.\n",num);elseprintf("%d is normal.\n",num);}}


0 0
原创粉丝点击