训练赛后补题 01
2020-06-29 训练赛 赛后补题:

WA in test12【原WA代码】:
1 #pragma warning (disable:4996) 2 #include <iostream> 3 #include<algorithm> 4 #include<stdio.h> 5 #include<math.h> 6 #include<string.h> 7 #include<string> 8 #define MAX1 100005 /*1e5 + 5*/ 9 #define MAX2 1000000005 /*le9 + 5*/ 10 #define T2 27 11 #define T3 18 12 using namespace std; 13 typedef long long int ll; 14 ll mf3[T2] = { 3 }; 15 ll mf2[T2] = { 2 }; 16 int main() { 17 ll n, m; 18 for (int i = 1, j = 1; i < T2; ++i, ++j) { 19 if (j < T3)mf3[j] = 3 * mf3[j - 1]; 20 mf2[i] = 2 * mf2[i - 1]; 21 // cout << mf3[i] << " " << mf2[i] << endl; 22 } 23 while (scanf("%lld %lld", &n, &m) != EOF) { 24 int t = 0, k; 25 if (m == n)printf("0\n"); 26 else if (m % n == 0) { 27 m /= n; 28 for (k = T3 - 1; k >= 0; --k) { 29 if (m % mf3[k] == 0) { 30 t += (k + 1); 31 break; 32 } 33 } 34 for (k = T2 - 1; k >= 0; --k) { 35 if (m % mf2[k] == 0) { 36 t += (k + 1); 37 break; 38 } 39 } 40 if (t)printf("%d\n", t); 41 else printf("-1\n"); 42 } 43 else printf("-1\n"); 44 } 45 return 0; 46 }
赛后自行测试:输入1 500000000 时输出错误
代码逻辑:mn相等时输出0;m是n的倍数时考虑是2的几次方倍和3的几次方倍;其余mn均为-1
代码谬误:当m是n的x倍数时,x可能有除了2、3以外的质因数。
修改后:
1 //AC代码: 2 #pragma warning (disable:4996) 3 #include <iostream> 4 #include<algorithm> 5 #include<stdio.h> 6 #include<math.h> 7 #include<string.h> 8 #include<string> 9 #define MAX1 100005 /*1e5 + 5*/ 10 #define MAX2 1000000005 /*le9 + 5*/ 11 #define MAX3 200005 /*1e5 + 5*/ 12 #define T2 27 13 #define T3 18 14 using namespace std; 15 typedef long long int ll; 16 #define MOL 998244353 17 18 ll mf3[T2] = { 3 }; 19 ll mf2[T2] = { 2 }; 20 int main() { 21 ll n, m; 22 for (int i = 1, j = 1; i < T2; ++i, ++j) { 23 if (j < T3)mf3[j] = 3 * mf3[j - 1]; 24 mf2[i] = 2 * mf2[i - 1]; 25 // cout << mf3[i] << " " << mf2[i] << endl; 26 } 27 while (scanf("%lld %lld", &n, &m) != EOF) { 28 int t = 0, k; 29 if (m == n)printf("0\n"); 30 else if (m % n == 0) { 31 m /= n; 32 for (k = T3 - 1; k >= 0; --k) { 33 if (m % mf3[k] == 0) { 34 t += (k + 1); 35 m /= mf3[k]; 36 break; 37 } 38 } 39 for (k = T2 - 1; k >= 0; --k) { 40 if (m % mf2[k] == 0) { 41 t += (k + 1); 42 m /= mf2[k]; 43 break; 44 } 45 } 46 if (t && m == 1)printf("%d\n", t); 47 else printf("-1\n"); 48 } 49 else printf("-1\n"); 50 } 51 return 0; 52 }
反思一下,我训练的时候大概脑子瓦特了。

浙公网安备 33010602011771号