题目大意:给两个数,第一个数的范文是10^100,第二个数10^6,第一个数是两个质数的乘积,问有没有不超过第二个数的数是第一个树的因子。
思路:10^6中只有7w+个素数,只要挨个判定能不能整除即可。然后这个题素数必须线性,不然就T。还有高精度一开始我压了4位,之后就wa,调了很长时间发现判断整除的过程中爆int了,换成long long就是T,最后十分生气,直接压到了7位,果断A了,好像时间还不慢。如果要用int的话,最多只能压3位,应该也能过。
CODE:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1001000 using namespace std; struct BigInt{ int num[1010],len; BigInt(char *s) { memset(num,0,sizeof(num)); int length = strlen(s + 1); len = 0; for(int i = length; i > 0; i -= 7) { int p = 1; ++len; for(int j = 0; j <= 6 && i - j > 0; ++j) { num[len] += (s[i - j] - '0') * p; p *= 10; } } } bool Divide(int x) { long long remain = 0; for(int i = len; i; --i) remain = (remain * 10000000 + num[i]) % x; return !remain; } }; int prime[MAX],primes; bool notp[MAX]; char src[10010]; int L; void Pretreatment() { for(int i = 2; i < MAX; ++i) { if (!notp[i]) prime[++primes] = i; for(int j = 1; j <= primes && prime[j] * i < MAX; ++j) { notp[prime[j] * i] = 1; if (i % prime[j] == 0) break; } } } int main() { Pretreatment(); while(scanf("%s%d",src + 1,&L),L) { BigInt p(src); bool flag = false; for(int i = 1; i <= primes && prime[i] < L; ++i) if(p.Divide(prime[i])) { flag = true; printf("BAD %d\n",prime[i]); break; } if(!flag) puts("GOOD"); } return 0; }
时间: 2024-10-30 00:18:57