您的位置:首页 > 编程语言 > C语言/C++

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;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm poj c++ 数学数论