POJ 2635 The Embarrassed Cryptographe
2014-11-20 15:06
1301 查看
题目大意
题目给出两个数字K和L,K是两个质数的乘积,要你判断其中最小的那个质数p是否满足p≤L。4 <= K <= 10100 and 2 <= L <= 106解题思路
高精度+同余运算同余运算有一下规律
(1)a≡a(mod d)
(2)a≡b(mod d)→b≡a(mod d)
(3)(a≡b(mod d),b≡c(mod d))→a≡c(mod d)
如果a≡x(mod d),b≡m(mod d),则
(4)a+b≡x+m (mod d)
(5)a-b≡x-m (mod d)
(6)a*b≡x*m (mod d )
(7)a≡b(mod d)则a-b整除d
还有一个规律我把他作为数论题
(8)如果ac≡bc(mod
m),且c和m互质,则a≡b(mod m)
这个在证明Fermat小定理的时候需要用到
大数用高精度存毫无问题,问题是如何大数取模
这里用到了第(4)、(6)条规律
例如有一个数字256,你要把512对p取模,根据规律,有
(((5) * 10 + 1) * 10 + 2) mod p = ((((5 mod p) * 10 + 1) mod p) * 10 + 2) mod p
至于四位一压八位一压都无所谓的。
这是我第一次写高精度6位一压。。。。。6666666666
Code
<span style="font-size:14px;">#define _CRT_SECU</span>RE_NO_WARNINGS #define MAXN 1000100 #include <iostream> #include <string> using namespace std; long long v[MAXN], prime[MAXN]; int TotalPrime = 0; void GetPrime(int n)//线性筛质数 { for (int i = 2; i <= n; i++) { if (!v[i]) prime[TotalPrime++] = i; for (int j = 0; j <= TotalPrime && prime[j] * i < n; j++) { v[prime[j] * i] = 1; if (i % prime[j] == 0) break; } } } long long IsMod(long long *number, int size, long long L)//大数取模 { int j = 0; long long ans = 0, x; while (prime[j] < L) { ans = 0; for (int i = 0; i < size; i++) { ans = (ans * 1000000 + number[i]) % prime[j]; } if (ans == 0) return prime[j]; j++; } return 0; } int main() { long long L; int i, j; long long number[100]; string BigNumber; GetPrime(MAXN); while (cin >> BigNumber >> L) { if (BigNumber == "0" && L == 0) return 0; int length = BigNumber.length(), size = 0; memset(number, 0, sizeof(number)); for (i = 0; i < length % 6; i++) { number[size] *= 10; number[size] += BigNumber[i] - 48; } j = 0; if (number[size]) size++; for (i = length % 6; i < length; i++) { if (j == 6) { j = 0; size++; } j++; number[size] *= 10; number[size] += BigNumber[i] - 48; }//高精度压位 if (number[size]) size++; i = 0; long long ans = IsMod(number, size, L);//大数取模 if (ans) cout << "BAD " << ans << endl; else cout << "GOOD" << endl; } return 0; }
相关文章推荐
- POJ 2635 The Embarrassed Cryptographer
- poj 2635 The Embarrassed Cryptographer ——高精度取模
- POJ2635--The Embarrassed Cryptographer--大数取模
- The Embarrassed Cryptographer POJ 2635 数论之高精度求模(同余模定理+千进制)
- The Embarrassed Cryptographer--POJ 2635
- POJ 2635 The Embarrassed Cryptographer
- poj 2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer
- poj 2635 The Embarrassed Cryptographer(数论)
- poj 2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer
- [ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)
- poj2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer(JAVA)
- poj 2635 The Embarrassed Cryptographer
- poj 2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer
- POJ 2635, The Embarrassed Cryptographer
- poj-2635-The Embarrassed Cryptographer