刚刚做了BestCoder我也是醉了,一共做了2题,最后结束系统测的时候全错了,rating直接掉了195,妈蛋,自己一检查,第一题一个特殊情况没特判,第二题一个小于等于号写成了小于号,然后立马又去HDU提交A掉了,A完我立马就醉了,我的rating啊,我的粉名,我怒了,以后每周都要打BestCoder!!!
第一题:就是枚举一个数的最大素因子,然后除一下就好了,记得数为1的时候输出0。
#include<cstdio>
#include<cmath>
const int N = 40004;
bool vi[N];
int prim[N];
int num;
void init(){
for(int i = 2; i < N; i++){
if(!vi[i]){
prim[num++] = i;
for(int j = i * i; j < N; j += i) vi[j] = true;
}
}
}
int main(){
init();
int n;
while(scanf("%d", &n) == 1){
if(n == 1){printf("0\n");continue;}
int ans = 0;
int m = n;
for(int i = 0; i < num && n != 1; i++){
if(n % prim[i] == 0){
ans = prim[i];
while(n % prim[i] == 0) n /= prim[i];
}
}
if(n > ans) ans = n;
printf("%d\n", m/ans);
}
return 0;
}
第二题:把A*B = N 的找一个最小的B的问题转化为找一个最小的 N mod A = 0。 N 应该为 aTb的形式,b一定是小于A的,因为若不小于A则可以一直减A。然后因为A <= 10000,我们可以从1到A枚举a,然后b所占的位数一定是小于等于4位的,我们可以枚举aT * 10 到 10000,如果 A - aT * 10^x % B < 10 ^ x 则我们可以保证取到a * b * 10^x + (A - aT * 10^x) % A == 0,这样问题就解决了。我的那可怜的小于号就是 i <= 10000 写成了 i < 10000错了,悲剧。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long LL;
LL toint(char *s){
LL ret = 0;
while(*s){
ret = ret * 10 + *s - '0';
s++;
}
return ret;
}
LL pow10[10];
int main(){
int A;
char s[10];
pow10[0] = 1;
for(int i = 1; i <= 8; i++) pow10[i] = pow10[i-1]*10;
while(scanf("%d%s", &A, s) == 2){
LL T = toint(s);
int len = strlen(s);
LL p = pow10[len];
int d = 0;
if(s[0] == '0') d++;
LL ans = 1LL << 62;
for(LL i = d; i < A + d; i++){
LL num = i * p + T;
if(num % A == 0){
ans = min(ans, num / A);
}
for(int i = 10; i <= 10000; i *= 10){
int x = (A - num * i % A) % A;
if(x < i){
ans = min(ans, (num * i + x) / A);
break;
}
}
}
printf("%I64d\n", ans);
}
return 0;
}
博主在BestCoder Round #19比赛中遇到挫折,因两道题目中的小错误导致rating大幅下降。第一题忽略了特殊情况的特判,第二题将小于等于号误写为小于号。赛后在HDU重新提交并修正错误后成功解决,博主深感懊悔并决定每周参与BestCoder以提升能力。

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



