题目:http://poj.org/problem?id=2635
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 100105
using namespace std;
int primes[1000000];
int k[50];
int cnt;
void table(){
int pNum=0;
primes[pNum++]=2;
for(int i=3;i<=1000010;i+=2){
bool flag=true;
for(int j=0;primes[j]*primes[j]<=i;j++)
if(!(i%primes[j]))
{
flag=false;
break;
}
if(flag)
primes[pNum++]=i;
}
return;
}
int main(){
char str[105];
int l,len,maxcnt;
table();
while(cin>>str>>l){
if(str[0]=='0'&&l==0)break;
len = strlen(str);
maxcnt = len/3;
if(len%3==0)maxcnt--;
for(cnt = maxcnt; cnt >= 0; cnt--){
k[cnt] = 0;
for(int j = 3; j >= 1; j--){
if(len-(maxcnt-cnt)*3-j < 0)continue;
k[cnt]*=10;
k[cnt]+=str[len-(maxcnt-cnt)*3-j]-'0';
}
}
int tmp;
bool flag = true;
for(int i = 0; primes[i] < l; i++){
tmp = k[0]%primes[i];
for(int j = 1; j <= maxcnt; j++){
tmp = (tmp*1000+k[j])%primes[i];
}
if(tmp!=0)continue;
cout<<"BAD "<<primes[i]<<endl;
flag = false;
break;
}
if(flag)cout<<"GOOD\n";
}
}
总结: 题意很简单, 就是大数有点难处理. 看了dalao解题报告用了千进制来储存k, 然后用同余定理做.