大素数判定,大整数因式分解模板 HDU 4910
2014-08-04 14:44
363 查看
#include <stdio.h>#include <algorithm>#include <math.h>#include <stdlib.h>#include <string.h>#include <time.h>using namespace std;typedef __int64 LL ;LL pri[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};LL ans[100005], flag;LL gcd(LL a, LL b) { //最大公因式求解模板while (b) {LL c = a % b;a = b;b = c;}return a;}LL multi(LL a, LL b, LL n) { //(a*b) mod n 模板LL tmp = 0;while (b) {if (b & 1) {tmp += a;if (tmp >= n) tmp -= n;}a <<= 1;if (a >= n) a -= n;b >>= 1;}return tmp;}LL multimod(LL a, LL m, LL n) { //a^m mod n 模板LL tmp = 1;a %= n;while (m) {if (m & 1) tmp = multi(tmp, a, n);a = multi(a, a, n);m >>= 1;}return tmp;}bool MiLLer_Rabin(LL n) { 素数判定模板if (n < 2) return 0;if (n == 2) return 1;if (!(n & 1)) return 0;LL k = 0, i, j, m, a;m = n - 1;while (!(m & 1)) m >>= 1, k++;for (i = 0; i < 10; i++) {if (pri[i] >= n) return 1;a = multimod(pri[i], m, n);if (a == 1) continue;for (j = 0; j < k; j++) {if (a == n - 1) break;a = multi(a, a, n);}if (j == k) return 0;}return 1;}LL poLLard_rho(LL c, LL n) {LL i, x, y, k, d;i = 1;x = y = rand() % n;k = 2;do {i++;d = gcd(n + y - x, n);if (d > 1 && d < n) return d;if (i == k) y = x, k <<= 1;x = (multi(x, x, n) + n - c) % n;} while (y != x);return n;}void rho(LL n) { //大整数因式分解模板if (MiLLer_Rabin(n)) {ans[flag] = n;flag++;return;}LL t = n;while (t >= n) t = poLLard_rho(rand() % (n - 1) + 1, n);rho(t);rho(n / t);return;}int main() {LL n;while(scanf("%I64d",&n) != EOF){if( n == -1 ) break;if( n == 1 ) {puts( "0" ) ;continue ;}if( n == 2 ) {puts( "1" ) ;continue ;}if(n != 4 && n % 4 == 0){printf("1\n");continue;}if(n%2 == 0){flag = 0 ;rho(n/2);sort( ans , ans + flag ) ;bool ok ;if( ans[0] == ans[flag-1] )ok = true ;elseok = false ;if( ok ){printf("%I64d\n",n-1);continue;}else{printf("1\n");continue;}}else{flag = 0 ;rho(n);sort( ans , ans + flag ) ;bool ok ;if( ans[0] == ans[flag-1] )ok = true ;elseok = false ;if(ok){printf("%I64d\n",n-1);continue;}else{printf("1\n");continue;}}}return 0 ;}题意 : 求 1 ~ n 中所有和n互质的数的乘积mod n。思路 : 是一道原题 ... 有个这样的结论 结论:对于 1,2,4,P^n, 2*P^n,答案为 N-1,其余情况都是1。也就是说,1,2,4,以及只有一个质因子(奇数)或者它的1/2只有一个质因子(偶数),答案是N-1.其余情况答案均是 1。好了,大整数分解下就完了
相关文章推荐
- hdu 2012 素数判定 xy之间的整数表达式素数 20140723.cpp
- HDU 素数判定
- hdu 1905 poj3641素数判定与快速幂取余
- hdu-2012-素数判定
- hdu 2012 素数判定(打表)(备战LQB)
- 模板编程 实例2 素数判定
- hdu 2012 素数判定
- hdu 2012 素数判定 Miller_Rabbin
- 素数判定 http://acm.hdu.edu.cn/showproblem.php?pid=2012
- hdu-素数判定
- HDU 2012 素数判定
- hdu 1164 质因子分解 (筛素数模板)+ hdu 1215
- HDU:2012素数判定
- hdu 2012 素数判定
- poj 3641&hdu 1905(伪素数判定)
- hdu_2012_素数判定
- hdu 2012 素数的判定
- hdu2012——素数判定解题报告
- 综合案例:输入一个整数判定是否素数
- [hdu 2012] 素数判定