大数同余(poj-2635)
(t*10)% k 会tle
转换为千进制
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e6 + 10000;
typedef long long ll;
int prime[maxn], isprime[maxn];
int cnt;
void get_prime(){
cnt = 0;
for(int i = 2; i < maxn; ++ i){
if(isprime[i] == 0)
prime[cnt ++] = i;
for(int j = 0; j < cnt && prime[j] * i < maxn; ++ j){
isprime[prime[j] * i] = 1;
if(i % prime[j] == 0)
break;
}
}
}
char s[110];
int a[50];
int l;
int main(){
get_prime();
while(~scanf("%s %d", s, &l)){
if(s[0] == '0' && l == 0)
break;
int flag = 1, len = strlen(s), ans = 0, num = 0, temp = 0;
for(int i = 0; i < len; ++ i){
temp ++;
if(temp == 3){
a[num++] = s[i]-48 + (s[i-1]-48)*10 + (s[i-2]-48)*100;
temp = 0;
}
}
if(temp == 1)
a[num++] = s[len-1]-48;
else if(temp == 2)
a[num++] = s[len-1]-48 + (s[len-2]-48)*10;
for(int i = 0; i < cnt; ++ i){
if(prime[i] >= l)
break;
int t = 0;
for(int j = 0; j < num-1; ++ j){
t = (t * 1000 + a[j]) % prime[i];
}
if(temp == 1)
t = (t * 10 + a[num-1]) % prime[i];
else if(temp == 2)
t = (t * 100 + a[num-1]) % prime[i];
else
t = (t * 1000 + a[num-1]) % prime[i];
if(t == 0){
ans = prime[i];
flag = 0;
break;
}
}
if(flag)
puts("GOOD");
else
printf("BAD %d\n", ans);
}
}