米勒罗宾素数测试法
#include<iostream> #include <cstdio> using namespace std; typedef long long LL; // 18位素数:154590409516822759 // 19位素数:2305843009213693951 (梅森素数) // 19位素数:4384957924686954497 LL prime[ 6 ] = { 2 , 3 , 5 , 233 , 331 }; LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘; O(1)乘法或者转化成二进制加法 return (x * y - ( long long )(x / ( long double )mod * y + 1e- 3 ) *mod + mod) % mod; /* LL ret = 0; while(y) { if(y & 1) ret = (ret + x) % mod; x = x * 2 % mod; y >>= 1; } return ret; */ } LL qpow(LL a, LL n, LL mod) { LL ret = 1 ; while (n) { if (n & 1 ) ret = qmul(ret, a, mod); a = qmul(a, a, mod); n >