题解 | #2026牛客寒假算法基础集训营1#

A+B Problem

https://ac.nowcoder.com/acm/contest/120561/A

ABCDEGHKL题个人正确代码。

我是验题人。

link

A

Python Code
import sys
input = sys.stdin.readline

P = 998244353

di = [[1, 1, 1, 0, 1, 1, 1],
     [0, 0, 1, 0, 0, 1, 0],
     [1, 0, 1, 1, 1, 0, 1],
     [1, 0, 1, 1, 0, 1, 1],
     [0, 1, 1, 1, 0, 1, 0],
     [1, 1, 0, 1, 0, 1, 1],
     [1, 1, 0, 1, 1, 1, 1],
     [1, 0, 1, 0, 0, 1, 0],
     [1, 1, 1, 1, 1, 1, 1],
     [1, 1, 1, 1, 0, 1, 1]]

inv100 = pow(100, P - 2, P)

t = int(input())
for _ in range(t):
    C = int(input())
    ps = list(map(int, input().split()))
    res = [0 for i in range(10)]

    for d in range(10):
        p1 = 1
        for i in range(7):
            if di[d][i]:
                p1 = p1 * ps[i] % P * inv100 % P
            else:
                p1 = p1 * (1 + P - ps[i] * inv100 % P) % P
        res[d] = p1

    f = [1 for i in range(C + 1)]
    for v in range(C + 1):
        x = v
        p = 1000
        for i in range(4):
            f[v] = f[v] * res[x // p] % P
            x %= p
            p //= 10

    ans = 0
    for v in range(C + 1):
        ans = (ans + f[v] * f[C - v] % P) % P
    print(ans)
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

constexpr int P = 998244353;

i64 power(i64 a, int b, int p = P) {
    i64 r = 1;
    for (; b > 0; b >>= 1, a = a * a % p) {
        if (b & 1) {
            r = r * a % p;
        }
    }
    return r;
}
const i64 inv100 = power(100, P - 2);

short di[10][7] = {
    {1, 1, 1, 0, 1, 1, 1},
    {0, 0, 1, 0, 0, 1, 0},
    {1, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 1, 1},
    {0, 1, 1, 1, 0, 1, 0},
    {1, 1, 0, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 1},
    {1, 0, 1, 0, 0, 1, 0},
    {1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 0, 1, 1}
};

void solve() {
    int c;
    cin >> c;
    vector<int> ps(7);
    for (int &pi : ps) {
        cin >> pi;
    }

    vector<i64> g(10);
    for (int d = 0; d < 10; d++) {
        i64 p1 = 1;
        for (int i = 0; i < 7; i++) {
            if (di[d][i]) {
                p1 = p1 * ps[i] % P * inv100 % P;
            } else {
                p1 = p1 * (1 + P - ps[i] * inv100 % P) % P;
            }
        }
        g[d] = p1;
    }

    vector<i64> f(c + 1, 1);
    for (int v = 0; v <= c; v++) {
        int x = v;
        for (int i = 0, p = 1000; i < 4; i++, p /= 10) {
            f[v] = f[v] * g[x / p] % P;
            x %= p;
        }
    }

    i64 ans = 0;
    for (int v = 0; v <= c; v++) {
        ans = (ans + f[v] * f[c - v] % P) % P;
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}

B

Python Code
import sys
input = sys.stdin.readline

P = 998244353
N = 200000

fac = [0] * (N + 1)
fac[0] = 1
for i in range(1, N + 1):
    fac[i] = fac[i - 1] * i % P

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    
    cnt = 0
    mn = min(b)
    for x in a:
        if x > mn:
            cnt += 1
    print(fac[cnt] * fac[n - cnt] % P)
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

constexpr int P = 998244353;
constexpr int N = 200000;

i64 fac[N + 1];

void solve() {
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> b[i];
    }

    int cnt = 0;
    int mn = *min_element(b.begin(), b.end());
    for (int x : a) {
        if (x > mn) {
            cnt++;
        }
    }
    cout << fac[cnt] * fac[n - cnt] % P << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    fac[0] = 1;
    for (int i = 1; i <= N; i++) {
        fac[i] = fac[i - 1] * i % P;
    }

    int t;
    cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}

C

签到。

Python Code
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    print((n - 2) * max(a) + a[0] + a[n - 1])
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    cout << i64(n - 2) * *max_element(a.begin(), a.end()) + a[0] + a[n - 1] << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}

D

二分。

Python Code
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n, k = map(int, input().split())
    a = list(map(int, input().split()))

    if sum(1 for x in a if x > 0) <= k:
        print(0)
    else:
        def check(t):
            time = [0 for i in range(n)]
            used = 0
            best = -1
            mx = -1
            for i in range(n):
                if a[i] == 0:
                    continue

                if mx < i:
                    used += 1
                    mx = max(best, i + a[i])
                    for j in range(i + 1, min(n, mx + 1)):
                        time[j] = 1
                else:
                    if time[i] < t:
                        for j in range(mx + 1, min(n, i + a[i] + 1)):
                            time[j] = time[i] + 1
                        mx = max(mx, i + a[i])
                    else:
                        best = max(best, i + a[i])
            return used <= k
        
        lo, hi, ans = 1, n, -1
        while lo <= hi:
            mid = (lo + hi) // 2
            if check(mid):
                hi = mid - 1
                ans = mid
            else:
                lo = mid + 1

        print(ans)
C++ Code
#include "bits/stdc++.h"

using namespace std;

void solve() {
	int n, k;
	cin >> n >> k;
	vector<int> a(n);
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		cnt += a[i] > 0;
	}
	
	if (cnt <= k) {
		cout << "0\n";
		return;
	}

	auto check = [&](int t) {
		vector<int> time(n);
		int used = 0, mx = -1, best = -1;
		for (int i = 0; i < n; ++i) {
			if (!a[i]) {
				continue;
			}
			if (mx < i) {
				used++;
                mx = max(best, i + a[i]);
				for (int j = i + 1; j < min(n, mx + 1); j++) {
                    time[j] = 1;
                }
			} else {
				if (time[i] < t) {
					for (int j = mx + 1; j < min(n, i + a[i] + 1); j++) {
						time[j] = time[i] + 1;
					}
					mx = max(mx, i + a[i]);
				} else {
                    best = max(best, i + a[i]);
				}
			}
		}
		return used <= k;
	};

	int lo = 1, hi = n, ans = -1;
	while (lo <= hi) {
		int mid = (lo + hi) / 2;
		if (check(mid)) {
			hi = mid - 1;
			ans = mid;
		} else {
			lo = mid + 1;
		}
	}
	cout << ans << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t;
	cin >> t;
	while (t--) {
		solve();
	}

	return 0;
}

E

签到。

Python Code
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n, k = map(int, input().split())
    a = list(map(int, input().split()))

    ans = max(k + a[n - 1], k + a[0])
    for i in range(n - 1):
        ans = max(ans, a[i] + a[i + 1])
    print(ans)
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

void solve() {
    int n, k;
    cin >> n >> k;

    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    int ans = max(k + a[n - 1], k + a[0]);
    for (int i = 0; i + 1 < n; i++) {
        ans = max(ans, a[i] + a[i + 1]);
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}

G

考虑以若干连续 结尾的数。

Python Code
import sys
input = sys.stdin.readline

def rev(x):
    return int(str(x)[::-1])

t = int(input())
for _ in range(t):
    l, r = map(int, input().split())
    ans = rev(r)
    if r > l:
        ans = max(ans, rev(r - 1))
    p = 10
    while p <= r:
        x = r // p * p - 1
        if l <= x <= r:
            ans = max(ans, rev(x))
        p *= 10
    print(ans)
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

i64 rev(i64 x) {
    string s = to_string(x);
    reverse(s.begin(), s.end());
    return stoll(s);
}

void solve() {
	i64 l, r;
	cin >> l >> r;

	i64 ans = rev(r);
	if (r > l) {
		ans = max(ans, rev(r - 1));
	}
 	for (i64 p = 10; p <= r; p *= 10) {
		i64 x = r / p * p - 1;
		if (x >= l && x <= r) {
			ans = max(ans, rev(x));
		}
	}
	cout << ans << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t;
	cin >> t;
	while (t--) {
		solve();
	}

	return 0;
}

H

dp。

Python Code
import sys
input = sys.stdin.readline

P = 998244353

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))

    dp = [0 for i in range(n + 1)]
    pre = [0 for i in range(n + 1)]

    dp[0] = 1
    pre[0] = 1

    last = [0 for i in range(32)]

    l = 1
    for i in range(n):
        for b in range(32):
            if a[i] >> b & 1:
                if last[b] + 1 > l:
                    l = last[b] + 1

        left = 0
        j = l - 2
        if j >= 0:
            left = pre[j]
        dp[i + 1] = ((pre[i] - left) % P + P) % P
        pre[i + 1] = (pre[i] + dp[i + 1]) % P
        for b in range(32):
            if a[i] >> b & 1:
                last[b] = i + 1
    print(dp[n])

K

签到。

Python Code
import sys
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n = int(input())
    if n == 1:
        print("YES\n1")
    elif n == 3:
        print("YES\n1 2 3")
    else:
        print("NO")
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

void solve() {
    int n;
    cin >> n;

    if (n == 1) {
        cout << "YES\n1\n";
    } else if (n == 3) {
        cout << "YES\n1 2 3\n";
    } else {
        cout << "NO\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}

L

签到。

Python Code
import sys
input = sys.stdin.readline

n = int(input())

if n % 10 == 0:
    print(1)
elif n % 10 == 5:
    print(2)
elif n % 10 % 2 == 0:
    print(5)
else:
    print(10)
C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = int64_t;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    if (n % 10 == 0) {
        cout << "1\n";
    } else if (n % 10 == 5) {
        cout << "2\n";
    } else if (n % 10 % 2 == 0) {
        cout << "5\n";
    } else {
        cout << "10\n";
    }
    
    return 0;
}
全部评论

相关推荐

01-08 11:19
已编辑
深圳职业技术学院 护士
我是从大一下学期5月开始转互联网的,原因很简单,对本专业的就业薪资与前景非常不满,而我特别想赚钱,所以选了互联网,而又因为带我的师兄都是前端,所以阴差阳错就做了前端当时的梦想就是进腾讯,进腾讯,进腾讯!大一下学期学了3个月的前端的基础知识后,开始参加学校工作室的考核,当时整个暑假都没回家,跑去自习室和考研的同学坐一下,那段时间我敢说我去的比大多数人早,走的比大多数人晚,把所有的时间精力都扑在做工作室考核上面,不过结果非常遗憾,我竞争不过两个超级大神,最后进不去了(广工的anyview是我一身之痛)不过进了物理学院的软件组,有了自己的工位还有好多转码师兄的指导后,开始长达半年的实验室之旅......在这半年,我几乎没有上课,没有去哪里玩,我像一个被写了程序的机器人一样,7点半起床,去实验室学前端,一直到晚上10点&nbsp;11点。我太笨了,太笨了,学东西太慢了,coderwhy的网课看了一遍又一遍,项目代码写了一遍又一遍,红宝书也是一遍一遍的看......就这样,过完了这打了鸡血的半年,寒假也只回去十天左右,然后就到了24年的3月我开始焦虑,非常非常的焦虑与害怕,因为我开始刷牛客了,开始去网上了解各种就业信息,一大堆负面信息朝我涌来,我不知道怎么区分就全盘接收前端已死,互联网完蛋了,非科班别想了,双非别想了,没有学历就等于判了死刑......有半个月我半夜都会被吓醒,后面想到的一个破局之路就是刷实习,大量的堆实习,弥补我双非的学历,非科班的专业带来的巨大劣势于是开始转战图书馆,找了考研的人一起坐,他们什么时候去我就什么时候去,开始背八股,前端三件套,框架,工程化,算法,计算机网络......这些对我当时的我来说太多了太多了,也太难太难了,越看越焦虑,越焦虑我越不敢停下来,每天晚上都要去跑5公里来让自己平静下来就这样过了一个多月,我准备的七七八八开始投实习了,第一次面试,我整个人紧张的止不住的颤抖,喝了一杯又一杯的水,上了一次又一次的厕所,皇天不负有心人,在四月底找到了自己的第一份外包实习,很大程度地缓解了我的焦虑,回去休息了半个月五一后入职,实习了一个星期左右,感觉太难受了,工作氛围及其压抑,同事也是感觉都乱来的,而且喜欢打压我,我在写算法的时候,他们老说不用写这个,这些是大厂才要的,你又进不去大厂......&nbsp;后面我只能偷偷跑楼下写,过了小半个月我实在呆不下去就离职回学校了,第一段实习就这样结束了,而且老板不给我发工资......于是我开始在学校二次沉淀了,开始大量刷leetcode&nbsp;代码随想录&nbsp;codetop&nbsp;准备更强的项目&nbsp;更深入地背八股,于是一直学啊学啊,那个暑假就回去两个星期学车,其他时间都呆在学校的实验室里24年8月开始全面投实习,拿了古茗&nbsp;卓望数码的offer,本来打算去杭州古茗的,结果美团打电话说面试通过,阴差阳错地去了上海美团,开启了自己的第一段实习刚去没多久,还没适应那里的生活工作环境,学校传来噩耗,外出实习被抓到了,老师逼我回去,说不回去毕不了业,我当时听完电话后,整个人崩溃了,我跑去公司楼道间一直哭,我不甘心,我太不甘心了,我不甘心来之不易的实习泡汤,幸好后面申请了一门实验课重修,如愿留在上海于是就在上海美团实习了四个月,一直到了25年1月,我开始飘了,我感觉自己牛逼坏了,感觉美团平台不够高,想去更高的腾讯和字节,放弃了美团核心部门,而且高转正率的机会,选择了离职,当时还在牛客写了一篇长文于是回家休息到年后,2月多开始回学校全力准备暑期实习,一直面一直挂,直到5月份才找到字节的实习,这三个月是我最痛苦最煎熬的日子,我的自信心被不断的击碎,一直面一直挂,而身边朋友开始接连上岸,我开始怀疑自己,开始后悔当时的决定,开始觉得自己就是一个看不清自己的傻逼然后呢,4月底&nbsp;在没招了,万念俱灰的时候,字节约面试了,一点也不想复习,裸面,结果阴差阳错给我干进去了5月中开始字节的实习,虽然压力比较大,但还可以接受,平平稳稳能干了三个月,自我感觉良好,以为转正稳了,结果到八月初的时候,通知转正失败,当时天都塌了,然后开始找其他部门的机会,后面活水成功,去另一个部门实习了一个月,其实转正概率也不小,但是当时也是心比天高,以为自己牛逼坏了,所以选择离职秋招9月中开始全面秋招,结果大家也知道,秋招大溃败,各种终面挂&nbsp;hr面挂&nbsp;排序挂&nbsp;有时候也不知道为什么挂,问题也都答出来了,算法也都写出来了,但就是挂哈哈哈哈其中很多时间都是在打字节的复活赛,反复仰卧起坐,反复鞭尸,后面感觉面字节跟回家和亲戚聊天一样,他会问什么我都知道,甚至我可以抢答,面完还能聊天开点玩笑......在12月中的时候,字节又约面了,阴差阳错又到了三面,结果还给整挂了,当时确实破防的要死,然后转部门面试,本来打算拒绝的,因为实在太心累,太折磨了,但还是咬咬牙去面了,然后莫名其妙问的也就那些,三面还整了几道脑筋急转弯,本来以为又要挂了,结果过了,据说是因为我的竞争对手三面ai作弊被发现了,所以只面了她16分钟,所以就轮到我了,我也不用hr面直接审批,然后审批半天,隔天直接谈薪,hr开了个我拒绝不了的薪资,而且表达出来的意思是无论其他开多少字节都能match的意思,诚意满满回望这两年多的经历,真的是非常非常感慨,我想和大家说的是每个人都会有属于自己花期,只是时间的问题而已,努力踏实做事,终究会有回报!我也曾在这条路上迷茫、焦虑、崩溃与无助,但我做的唯一的一件事情就是,整理好心情,重新出发,坚持下去,光脚的不怕穿鞋的,拼了兄弟们!
码农索隆:我感觉兄弟你所处在环境已经算是双非中比较好的了,双非院校中很少有实验室,也鲜有师哥师姐会带着去学习,而你也很争气抓住了这次机会,一飞冲天
现在前端的就业环境真的很...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务