uva 10006(幂取模)

来源:互联网 发布:java分布式缓存技术 编辑:程序博客网 时间:2024/06/07 10:01

题意:判断一个数n。如果满足不是素数,并且 \begin{displaymath}a^n \bmod n = a\end{displaymath}  (0 < a < n),对任意一个整数a都满足这个式子,就是Carmichael,否则不是。

题解:用幂取模的公式,为了提高效率用分治法。

#include <stdio.h>#include <string.h>#include <math.h>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 n;while (scanf("%d", &n) && n) {int flag = 0;for (int i = 2; i <= sqrt(n); i++)if (n % i == 0) {flag = 1;break;}if (!flag) {printf("%d is normal.\n", n);continue;}for (int i = 1; i < n; i++) {if (i != pow_mod(i, n, n)) {flag = 0;break;}}if (!flag)printf("%d is normal.\n", n);elseprintf("The number %d is a Carmichael number.\n", n);}return 0;}


0 0