2019牛客暑期多校训练营 第十场

题目链接:https://ac.nowcoder.com/acm/contest/890#question


B:

cf897C跟这个题非常像。递归完事。

 1 /* Nowcoder Contest 890
 2  * Problem B
 3  * Au: SJoshua
 4  */
 5 #include <cassert>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <string>
 9 #include <iostream>
10 #include <algorithm>
11 
12 using namespace std;
13 
14 const string A("COFFEE"), B("CHICKEN");
15 
16 vector <long long int> len(70);
17 
18 char solve(int index, long long int pos) {
19     assert(1 <= index && 1 <= pos);
20     if (index == 1) {
21         if (pos <= 6) {
22             return A[pos - 1];
23         } else {
24             return ' ';
25         }
26     } else if (index == 2) {
27         if (pos <= 7) {
28             return B[pos - 1];
29         } else {
30             return ' ';
31         }
32     }
33     if (pos <= len[index - 2]) {
34         return solve(index - 2, pos);
35     } else {
36         return solve(index - 1, pos - len[index - 2]);
37     }
38 }
39 
40 int main(void) {
41     int T;
42     cin >> T;
43     len[1] = 6;
44     len[2] = 7;
45     for (int i = 3; i <= 69; i++) {
46         len[i] = len[i - 1] + len[i - 2];
47     }
48     while (T--) {
49         int n;
50         long long int k;
51         cin >> n >> k;
52         n = min(n, 69);
53         for (long long int pos = k; pos < k + 10; pos++) {
54             if (pos <= len[n]) {
55                 cout << solve(n, pos);
56             }
57         }
58         cout << endl;
59     }
60     return 0;
61 }
Code via. Sjoshua

D:

exCRT模板题,注意会爆long long。

 1 ai = []
 2 bi = []
 3  
 4 for i in range(200):
 5     ai.append(0)
 6     bi.append(0)
 7  
 8 def mul(a, b, mod):
 9     ret = 0
10     while b > 0:
11         if b & 1:
12             ret = (ret + a) % mod
13         a = (a + a) % mod
14         b >>= 1
15     return ret
16  
17 x = 0
18 y = 0
19  
20 def exgcd(a, b):
21     global x, y
22     if b == 0:
23         x = 1
24         y = 0
25         return a
26     gcd = exgcd(b, a % b)
27     tp = x
28     x = y
29     y = tp - a // b * y
30     return gcd
31  
32 def excrt():
33     global x, y
34     M = bi[1]
35     ans = ai[1]
36     for i in range(2, n + 1):
37         a = M
38         b = bi[i]
39         c = (ai[i] - ans % b + b) % b
40         gcd = exgcd(a, b)
41         bg = b // gcd
42         if c % gcd != 0:
43             print("he was definitely lying")
44             exit()
45         x = mul(x, c // gcd, bg)
46         ans += x * M
47         M *= bg
48         ans = (ans % M + M) % M
49     return (ans % M + M) % M
50  
51 (n, k) = map(int, input().split())
52 for i in range(1, n + 1):
53     (t1, t2) = map(int, input().split())
54     bi[i] = t1
55     ai[i] = t2
56 ans = excrt()
57 if ans <= k:
58     print(ans)
59 else:
60     p
Code via. Sjoshua

E:

分治判断点的位置。

/* Nowcoder Contest 890
 * Problem E
 * Au: SJoshua
 */
#include <cstdio>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
struct cord {
    int x, y;
    unsigned long long int dis;
};
 
bool inRange(unsigned long long int n, unsigned long long int a, unsigned long long int b) {
    return a <= n && n <= b;
}
//LURD
unsigned long long int calc(int x, int y, unsigned long long int base, int size, int mode = 2) {
    // cout << x << ", " << y << ": " << base << "(" << size << ")"<<mode<< endl;
    if (!size) {
        return base;
    }
    int half = 1 << (size - 1);
    unsigned long long int block = (unsigned long long int) half * half;
    if (inRange(x, 1, half) && inRange(y, 1, half)) {
        switch (mode) {
            case 1: return calc(x, y, base + block * 0, size - 1, 2);
            case 2: return calc(x, y, base + block * 0, size - 1, 1);
            case 3: return calc(x, y, base + block * 2, size - 1, 3);
            case 4: return calc(x, y, base + block * 2, size - 1, 4);
        }
    } else if (inRange(x, 1, half) && inRange(y, 1 + half, half + half)) {
        switch (mode) {
            case 1: return calc(x, y - half, base + block * 1, size - 1, 1);
            case 2: return calc(x, y - half, base + block * 3, size - 1, 3);
            case 3: return calc(x, y - half, base + block * 3, size - 1, 2);
            case 4: return calc(x, y - half, base + block * 1, size - 1, 4);
        }
    } else if (inRange(x, 1 + half, half + half) && inRange(y, 1, half)) {
        switch (mode) {
            case 1: return calc(x - half, y, base + block * 3, size - 1, 4);
            case 2: return calc(x - half, y, base + block * 1, size - 1, 2);
            case 3: return calc(x - half, y, base + block * 1, size - 1, 3);
            case 4: return calc(x - half, y, base + block * 3, size - 1, 1);
        }
    } else if (inRange(x, 1 + half, half + half) && inRange(y, 1 + half, half + half)) {
        switch (mode) {
            case 1: return calc(x - half, y - half, base + block * 2, size - 1, 1);
            case 2: return calc(x - half, y - half, base + block * 2, size - 1, 2);
            case 3: return calc(x - half, y - half, base + block * 0, size - 1, 4);
            case 4: return calc(x - half, y - half, base + block * 0, size - 1, 3);
        }
    }
    return 0;
}
 
int main(void) {
    int n, k;
    cin >> n >> k;
    vector <cord> pos(n);
    for (int i = 0; i < n; i++) {
        cin >> pos[i].x >> pos[i].y;
        pos[i].dis = calc(pos[i].x, pos[i].y, 0, k);
    }
    sort(pos.begin(), pos.end(), [](cord &a, cord &b)->bool {
        return a.dis < b.dis;
    });
    for (auto e: pos) {
        cout << e.x << " " << e.y /* << "->" << e.dis*/ << endl;
    }
    return 0;
}
Code via. Sjoshua

F:

H:

看点的度数判一下就行。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int d[10], d2[10];
21 
22 int main() {
23     int t; scanf("%d", &t);
24     while (t--) {
25         vector<int>a[10];
26         for (int i = 0; i < 7; i++) {
27             d[i] = d2[i] = 0; a[i].clear();
28         }
29         for (int i = 1; i <= 5; i++) {
30             int x, y; scanf("%d%d", &x, &y);
31             d2[x]++, d2[y]++; d[x]++, d[y]++;
32             a[x].pb(y), a[y].pb(x);
33         }
34         sort(d2 + 1, d2 + 7);
35         if (d2[6] == 2) puts("n-hexane"); 
36         else if (d2[6] == 4) puts("2,2-dimethylbutane"); 
37         else if (d2[4] == 1) puts("2,3-dimethylbutane"); 
38         else {
39             int pos;
40             for (pos = 1; pos < 7; pos++)
41                 if (d[pos] == 3) break;
42             if (d[a[pos][0]] + d[a[pos][1]] + d[a[pos][2]] == 4) puts("2-methylpentane");
43             else if (d[a[pos][0]] + d[a[pos][1]] + d[a[pos][2]] == 5) puts("3-methylpentane");
44         }
45     }
46     return 0;
47 }
View Code

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/11371029.html