牛客周赛 Round 6 解题报告 | 珂学家 | 数学场

2024-01-17 02:04

本文主要是介绍牛客周赛 Round 6 解题报告 | 珂学家 | 数学场,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前言

alt

一切都是命运的安排。


整体评价

这场整体感觉有点简单,D题感觉不错,E题应该是超纲了。整场还是偏数学,个人还是喜欢Round 4/Round 5.


A. 游游的数字圈

简单模拟题

  • 0,6,9对应一个圆圈
  • 8对应2个圆圈
import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));char[] str = sc.next().toCharArray();int ans = 0;for (char c: str) {int p = c - '0';if (p == 0 || p == 6 || p == 9) ans++;else if (p == 8) ans += 2;}System.out.println(ans);}}
#include <bits/stdc++.h>using namespace std;int main() {string s;cin >> s;int res = 0;for (char c: s) {if (c == '0') res += 1;else if (c=='6') res += 1;else if (c == '8') res+= 2;else if (c == '9') res+= 1;}cout << res << endl;return 0;
}

B. 竖式乘法

阅读题吧,

就是b的每个位数乘以a的累计和

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int kase = sc.nextInt();while (kase-- > 0) {long a = sc.nextInt();long b = sc.nextInt();long ans = 0;while (b > 0) {long t = b % 10;ans += a * t;b /= 10;}System.out.println(ans);}}}

C. 游游的数值距离

这题还是稍有点头痛的

化简公式 ∣ x ! × y − y − n ∣ |x!\times y - y - n| x!×yyn 等价于 ∣ ( x ! − 1 ) ∗ y − n ∣ |(x! - 1) * y - n| (x!1)yn

求这个绝对值最小化时的,x,y值

由于n固定,那如何求解x,y呢?

可以发现x!膨胀非常的快,所以可以从x枚举入手

然后反解y值,因为是绝对值

所以 y ∈ { n / ( x ! − 1 ) , ( n + x ! − 2 ) / ( x ! − 1 ) } y\in \{ n/(x! - 1), (n+x!-2)/(x! - 1) \} y{n/(x!1),(n+x!2)/(x!1)}

当然这题还有额外的限制,就是x,y都不能等于2,且为正整数

关键还是找对切入点

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));long n = sc.nextInt();long diff = Long.MAX_VALUE;long tx = 0, ty = 0;// 枚举x就行long x = 1l;for (int i = 1; x - 1 <= n; i++) {x = x * i;if (i == 1) {// 1 要 特判if (diff > n) {diff = n;tx = 1; ty = 1;}}if (x > 1 && i != 2) {long y1 = n / (x - 1);long y2 = (n + x - 2) / (x - 1);if (y1 != 2 && y1 > 0) {long t = Math.abs((x - 1) * y1 - n);if (diff > t) {diff = t;tx = i;ty = y1;}}if (y2 != 2 && y2 > 0) {long t2 = Math.abs((x - 1) * y2 - n);if (diff > t2) {diff = t2;tx = i;ty = y2;}}}}System.out.println(tx + " " + ty);}}

D. 游游的k-好数组

这题其实有点意思,但是如果找对正确的切入点,那这题还是蛮简单的。

因为最终所有的k长度的区间,其区间和相等.

比如 [ a 1 , a 2 , . . . , a k ] , [ a 2 , a 3 , . . . a k , a k + 1 ] [a_1, a_2, ..., a_k], [a_2,a_3,...a_k,a_{k+1}] [a1,a2,...,ak],[a2,a3,...ak,ak+1]

可以推导出 a 1 = = a k + 1 a_1 == a_{k+1} a1==ak+1

从中我们可以推导出按取模k,进行分组

每组中元素必须相等

可以先按必须的给予操作(从x中获得)

如果最终的操作数 大于 x,则无解

如果小于等于, 则剩余x,可以贪心给予某一组,从而求解最大值。

import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int kase = sc.nextInt();while (kase-- > 0) {int n = sc.nextInt(), k = sc.nextInt(), x = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}// 进行分组long[] last = new long[k];List<Integer>[]g = new List[k];Arrays.setAll(g, t -> new ArrayList<>());for (int i = 0; i < n; i++) {g[i % k].add(arr[i]);}for (int i = 0; i < k; i++) {long mv = g[i].get(0);for (long v: g[i]) {mv = Math.max(mv, v);}last[i] = mv;for (int j = 0; j < g[i].size(); j++) {x -= (mv - g[i].get(j));}}if (x < 0) {System.out.println(-1);} else {long ans = 0;for (int i = 0; i < k; i++) {ans = Math.max(ans, last[i] + x / g[i].size());}System.out.println(ans);}}}}

E. 小红的循环节长度

这题应该超纲了

我大概知道的知识点是, 如果除数只有2,5的因子,则一定是有限个数的有理数,否则存在循环节。

这是知乎上的一个讨论

大概意思为,混合小数中,不循环部分和2,5因子有关,循环节则和q的欧拉函数因子有关

特别要注意,求快速幂时,因为模数超过int范围,则两个long相乘会直接溢出,因为需要int128,当然java需用大数类。

import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;public class Main {static long gcd(long a, long b) {return b == 0 ? a : gcd(b, a % b);}static long phi(long v) {long r = v;for (long i = 2; i <= v/i; i++) {if (v % i == 0) {r = r / i * (i - 1);while (v % i == 0) v /= i;}}if (v > 1) r = r / v * (v - 1);return r;}// 这边需要特别注意,要用大数,因为q这个模数超过int, long * long 会溢出static long ksm(long b, long v, long q) {BigInteger bigQ = BigInteger.valueOf(q);BigInteger r = BigInteger.valueOf(1l);BigInteger base = BigInteger.valueOf(b).mod(bigQ);while (v > 0) {if (v % 2 == 1) {r = r.multiply(base).mod(bigQ);}v /= 2;base = base.multiply(base).mod(bigQ);}return r.mod(bigQ).longValue();}public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));long p = sc.nextLong(), q = sc.nextLong();long gv = gcd(p, q);q /= gv;int cnt2 = 0, cnt5 = 0;while (q % 2 == 0) { q /= 2; cnt2++; }while (q % 5 == 0) { q /= 5; cnt5++; }if (q == 1) {System.out.println(-1);} else {long ans = Long.MAX_VALUE;long nq = phi(q);for (long i = 1; i <= nq / i; i++) {if (nq % i == 0) {if (ksm(10, i, q) == 1) ans = Math.min(ans, i);if (ksm(10, nq / i, q) == 1) ans = Math.min(ans, nq / i);}}System.out.println("" + Math.max(cnt2, cnt5) + " " + ans);}}}

写在最后

不辅助就只能回去继承家业了。

alt

这篇关于牛客周赛 Round 6 解题报告 | 珂学家 | 数学场的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614604

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int