训练赛后补题 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 }

反思一下,我训练的时候大概脑子瓦特了。

posted @ 2020-06-30 12:49  听说福建人很好吃  阅读(55)  评论(0)    收藏  举报