题目:
http://poj.org/problem?id=2635
题意:
给定一个大数k,是两个素数的乘积,问这两个素数中最小的一个是否小于L,若是就输出”bad”和素数,否则额输出good
思路:
首先把L内的素数表打出来,然后高精度取模,但是用十进制取模的话会T,所以用更高进制,这里用的千进制数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <climits>
#include <cmath>
#include <queue>
using namespace std;
const int N = 1000010;
int f[N], prime[N];
char str[210];
int table()//线性筛
{
f[0] = f[1] = 1;
int k = 0;
for(int i = 2; i < N; i++)
{
if(f[i] == 0) prime[k++] = i;
for(int j = 0; j < k && i * prime[j] < N; j++)
{
f[i*prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
return k;
}
bool check(int *arr, int cnt, int n)//高精度取模
{
int tm = 0;
for(int i = 0; i < cnt; i++)
tm = (tm * 1000 + arr[i]) % n;
return tm == 0;
}
int main()
{
int k = table();
int n;
while(scanf("%s%d", str, &n), str[0] != '0' || n)
{
int arr[210], cnt = 0;
int len = strlen(str);
int id = len % 3;
if(id == 1) arr[cnt++] = str[0]-'0';
else if(id == 2) arr[cnt++] = (str[0]-'0')*10 + str[1]-'0';
for(int i = id; i < len; i += 3)
arr[cnt++] = (str[i]-'0')*100 + (str[i+1]-'0')*10 + str[i+2]-'0';
int res = -1;
for(int i = 0; i < k; i++)
{
if(prime[i] >= n) break;
if(check(arr, cnt, prime[i]))
{
res = prime[i];
break;
}
}
if(res == -1) printf("GOOD\n");
else printf("BAD %d\n", res);
}
return 0;
}