一个很不错的数学题,刚开始看完题目的时候就有了思路,但是交上去的代码一直TLE,仔细算了下时间复杂度,觉得都不会TLE。后来实在想不出来,就看了下别人的题解,有人说将K看作是1000进制的数,这样就能使时间复杂度降低100倍左右,后来就写了一下。哎。。。。。。智商着急啊
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAX 110
#define MAXN 1000010
#define ll __int64
using namespace std;
char s[MAX];
int a[MAX];
bool solve(int x, int n){ //判断K是否能被素数x整除
ll u = 0;
for (int i = n-1; i >= 0; i--){
u = u*1000 + a[i];
u = u % x;
}
u = u % x;
if (u == 0) return true;
return false;
}
bool is[MAXN];
ll prim[MAXN];
int main(){
memset(is,false,sizeof(is)); //筛选素数法求出1-1000000以内的所有素数(此处K被看做千进制)
int cnt = 0;
for (int i=2; i<=MAXN; i++){
if (!is[i]) prim[cnt++] = i;
for (int j=0; j<cnt && prim[j]*i <= MAXN; j++){
is[i*prim[j]] = true;
if (i % prim[j] == 0) break;
}
}
int l;
while (scanf("%s%d",s,&l)){
if (s[0] == '0') break;
int len = strlen(s);
int sum = 0,cnt = -1;
for (int i = len-1; i>=0; i-=3){
cnt++;
a[cnt] = 0;
if (i-2>=0){
for (int j = i-2; j<=i; j++)
a[cnt] = a[cnt]*10 + s[j] - '0';
}
else if (i-1>=0){
for (int j = i-1; j<=i; j++)
a[cnt] = a[cnt]*10 + s[j] - '0';
}
else if (i >= 0){
a[cnt] = s[i] - '0';
}
}
cnt++;
int ok = 0, ans;
for (int i = 0; prim[i] < l; i++){
if (solve(prim[i],cnt)){
ok = 1;
ans = prim[i];
break;
}
}
if (ok) printf("BAD %d\n",ans);
else printf("GOOD\n");
}
return 0;
}
本文探讨了一个数学问题的解决策略,通过将问题中的数K视为千进制数来降低时间复杂度,从而避免了TLE(超出时间限制)。文章详细解释了从直觉到优化的过程,并提供了关键代码片段。
263

被折叠的 条评论
为什么被折叠?



