KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解

46 篇文章 7 订阅
43 篇文章 6 订阅

A - Century

题目大意

公元 N N N年在第几个世纪中?

一个世纪是由 100 100 100个年份组成的一个区间。如, 1 1 1世纪为 [ 1 , 100 ] [1,100] [1,100]年, 2 2 2世纪为 [ 101 , 200 ] [101,200] [101,200]年,……

1 ≤ N ≤ 3000 1\le N\le 3000 1N3000

输入格式

N N N

输出格式

将答案输出为一个整数。

样例

N N N输出
2021 2021 2021 21 21 21
200 200 200 2 2 2

分析

根据本题条件我们可以推出:公元 N N N年在世纪 ⌈ N 100 ⌉ \lceil \frac N {100}\rceil 100N

代码

#include <cstdio>
using namespace std;

int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", n % 100 == 0? n / 100: n / 100 + 1);
	return 0;
}

B - 200th ABC-200

题目大意

对于整数 N N N,执行 K K K次如下操作:

  • 如果 N N N 200 200 200的倍数,将 N N N除以 200 200 200
  • 否则,在 N N N后面添上 200 200 200。(如, 123 123 123变为 123200 123200 123200)。

1 ≤ N ≤ 1 0 5 1\le N\le 10^5 1N105
1 ≤ K ≤ 20 1\le K\le 20 1K20

输入格式

N   K N~K N K

输出格式

输出最终的 N N N

样例

N N N K K K输出
2021 2021 2021 4 4 4 50531 50531 50531
40000 40000 40000 2 2 2 1 1 1
8691 8691 8691 20 20 20 84875488281 84875488281 84875488281

分析

本题我们按照题意模拟即可,但我们需要证明答案不会超过 2 63 − 1 2^{63}-1 2631,这样才能使用long long

  • 任何数 N N N添上 200 200 200都是 200 200 200的倍数。证明:一个数只要是 100 100 100 2 2 2的公倍数,它就是 200 200 200的倍数。 N N N添上 200 200 200后以00结尾,就证明了它是 200 200 200的倍数。
  • 这样, N N N每次添上 200 200 200后都要除以 200 200 200,相当于去掉两个零再将 N N N除以 2 2 2
  • 所以, N N N每次最多增加一位,还经常减少位数(除以 200 200 200),肯定严格小于 2 63 2^{63} 263

代码

#include <cstdio>
using namespace std;

int main()
{
	long long n;
	int k;
	scanf("%lld%d", &n, &k);
	while(k--)
		n = n % 200LL == 0LL? n / 200LL: n * 1000LL + 200LL;
	printf("%lld\n", n);
	return 0;
}

C - Ringo’s Favorite Numbers 2

题目大意

给定序列 A = ( A 1 , A 2 , … , A N ) A=(A_1,A_2,\dots,A_N) A=(A1,A2,,AN),找到符合下列条件的所有 ( i , j ) (i,j) (i,j)

  • 1 ≤ i < j ≤ N 1\le i < j\le N 1i<jN
  • ∣ A i − A j ∣ |A_i-A_j| AiAj 200 200 200的倍数。

2 ≤ N ≤ 2 × 1 0 5 2\le N\le 2\times 10^5 2N2×105
1 ≤ A i ≤ 1 0 9 1\le A_i\le 10^9 1Ai109

输出格式

N N N
A 1   A 2   …   A N A_1~A_2~\dots~A_N A1 A2  AN

样例

A A A输出
( 123 , 223 , 123 , 523 , 200 , 2000 ) (123,223,123,523,200,2000) (123,223,123,523,200,2000) 4 4 4
( 1 , 2 , 3 , 4 , 5 ) (1,2,3,4,5) (1,2,3,4,5) 0 0 0
( 199 , 100 , 200 , 400 , 300 , 500 , 600 , 200 ) (199,100,200,400,300,500,600,200) (199,100,200,400,300,500,600,200) 9 9 9

分析

首先,最容易想到的 O ( n 2 ) \mathcal O(n^2) O(n2)的暴力算法肯定不行,因为 2 ≤ N ≤ 2 × 1 0 5 2\le N\le 2\times 10^5 2N2×105
我们考虑用桶优化:
我们有 200 200 200个桶,分别如下:

桶的编号元素 1 1 1元素 2 2 2元素 3 3 3元素 4 4 4……元素除以 200 200 200的余数
0 0 0 0 0 0 200 200 200 400 400 400 600 600 600…… 0 0 0
1 1 1 1 1 1 201 201 201 401 401 401 601 601 601…… 1 1 1
2 2 2 2 2 2 202 202 202 402 402 402 602 602 602…… 2 2 2
……………………………………
198 198 198 198 198 198 398 398 398 598 598 598 798 798 798…… 198 198 198
199 199 199 199 199 199 399 399 399 599 599 599 799 799 799…… 199 199 199
这时,我们发现,每个桶中的每个元素都能与这个同种的其他元素组成一对,所以我们只要在将元素加入桶中前将答案加上桶目前的大小即可。

总时间复杂度 O ( n ) \mathcal O(n) O(n)

代码

我们的桶中不需要真正的元素,只需要记录桶的大小即可。
注意:答案的数据类型一定要用long long

#include <cstdio>
#define MOD 200
using namespace std;

int cnt[MOD];

int main()
{
	int n;
	scanf("%d", &n);
	long long ans = 0LL;
	while(n--)
	{
		int x;
		scanf("%d", &x);
		ans += cnt[x %= MOD] ++;
	}
	printf("%lld\n", ans);
	return 0;
}

D - Happy Birthday! 2

题目大意

给定序列 A = ( A 1 , A 2 , … , A N ) A=(A_1,A_2,\dots,A_N) A=(A1,A2,,AN)。你要从中选出两个子序列 B B B C C C(下标不同,不要求连续),使得 ∑ B ≡ ∑ C ( m o d 200 ) \sum B\equiv \sum C\pmod{200} BC(mod200)

2 ≤ N ≤ 200 2\le N\le 200 2N200
1 ≤ A i ≤ 1 0 9 1\le A_i\le 10^9 1Ai109

输入格式

N N N
A 1   A 2   …   A N A_1~A_2~\dots~A_N A1 A2  AN

输出

如果没有合法的 B B B C C C,输出No
如果有合法的 B B B C C C,按下列格式输出,其中 x x x B B B的长度、 y y y C C C的长度, B ′ B' B B B B中元素对应的下标, C ′ C' C C C C中元素对应的下标:
Yes \text{Yes} Yes
x   B 1 ′   B 2 ′   …   B x ′ x~B'_1~B'_2~\dots~B'_x x B1 B2  Bx
y   C 1 ′   C 2 ′   …   C y ′ y~C'_1~C'_2~\dots~C'_y y C1 C2  Cy

样例

略,请自行前往AtCoder查看

分析

我们可以证明,只要 N ≥ 8 N\ge 8 N8,那么就一定有解。证明如下:

  • 8 8 8个元素能组成的子序列有 2 8 − 1 = 255 2^8-1=255 281=255种。(每个元素可以选或不选,去掉全不选的情况)
  • 根据抽屉原理,我们将这 255 255 255种子序列按照他们除以 200 200 200的余数分别放入抽屉中,则至少有两个子序列在一个抽屉中,即必定有合法的 A A A B B B

N < 8 N<8 N<8时,我们暴力枚举所有可能;
N ≥ 8 N\ge8 N8时,我们暴力枚举其中任意 8 8 8个元素组成的所有可能即可找到解。

代码

#include <cstdio>
#include <vector>
#define maxn 10
#define MOD 200
using namespace std;

int a[maxn];
vector<int> bkt[MOD];

inline void print(const vector<int>& v)
{
	printf("%llu", v.size());
	for(int x: v)
		printf(" %d", x + 1);
	putchar('\n');
}

int main()
{
	int n;
	scanf("%d", &n);
	if(n > 8) n = 8;
	for(int i=0; i<n; i++)
		scanf("%d", a + i);
	int lim = 1 << n;
	for(int st=0; st<lim; st++)
	{
		int s = 0;
		vector<int> pos;
		for(int i=0; i<n; i++)
			if(st >> i & 1)
				s = (s + a[i]) % MOD, pos.push_back(i);
		if(!bkt[s].empty())
		{
			puts("Yes");
			print(bkt[s]);
			print(pos);
			return 0;
		}
		else bkt[s] = pos;
	}
	puts("No");
	return 0;
}

E - Patisserie ABC 2

题目大意

N 3 N^3 N3个三元组 ( i , j , k ) (i,j,k) (i,j,k) 1 ≤ i , j , k ≤ N 1\le i,j,k\le N 1i,j,kN),按如下排序:

  • i + j + k i+j+k i+j+k小的排在前面。
  • 对于 i + j + k i+j+k i+j+k相同的三元组, i i i小的排在前面,对于 i i i相同的, j j j小的排在前面。

求第 K K K ( i , j , k ) (i,j,k) (i,j,k)

1 ≤ N ≤ 1 0 6 1\le N\le 10^6 1N106
1 ≤ K ≤ N 3 1\le K\le N^3 1KN3

输入格式

N   K N~K N K

输出格式

输出第 K K K ( i , j , k ) (i,j,k) (i,j,k),用空格分隔。

样例

N N N K K K输出
2 2 2 5 5 5 1   2   2 1~2~2 1 2 2
1000000 1000000 1000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000   1000000   1000000 1000000~1000000~1000000 1000000 1000000 1000000
9 9 9 47 47 47 3   1   4 3~1~4 3 1 4

分析

由于每个三元组的和都不会超过 3 N 3N 3N,所以我们考虑暴力枚举三元组的和,这样就能快速算出第 K K K个三元组的和。那么,问题来了:符合 i + j + k = n i+j+k=n i+j+k=n的三元组 ( i , j , k ) (i,j,k) (i,j,k) i , j , k i,j,k i,j,k均不超过 N N N)有多少个?
这可以用容斥原理解决。首先,我们发现,上述问题实际上就是在求如下方程解的个数:
{ i + j + k = n 1 ≤ i , j , k ≤ N \begin{cases}i+j+k=n\\1\le i,j,k\le N\end{cases} {i+j+k=n1i,j,kN
如果我们将问题改成求如下方程解的个数(注意 n n n N N N的区别):
{ i + j + k = n 1 ≤ i , j , k ≤ n \begin{cases}i+j+k=n\\1\le i,j,k\le n\end{cases} {i+j+k=n1i,j,kn
这个可以用挡板法解决,在 n − 1 n-1 n1个位置上任选 2 2 2个插入挡板,挡板分开的就是 i , j , k i,j,k i,j,k,则公式为 C n − 1 2 C_{n-1}^2 Cn12。我们设 f ( n ) =   f(n)=~ f(n)= 上述方程解的个数( C n − 1 2 = ( n − 1 ) ( n − 2 ) C_{n-1}^2=(n-1)(n-2) Cn12=(n1)(n2)),则总方程解的个数为 f ( n ) f(n) f(n)
我们考虑一个、两个(不可能有三个)数大于 N N N的情况,这样 { i + j + k = n 1 ≤ i , j , k ≤ N \begin{cases}i+j+k=n\\1\le i,j,k\le N\end{cases} {i+j+k=n1i,j,kN这个方程解的个数就为 f ( n ) + 3 f ( n − 2 N ) − 3 f ( n − N ) f(n)+3f(n-2N)-3f(n-N) f(n)+3f(n2N)3f(nN)

代码

计算 f ( n ) f(n) f(n)时注意特判 n ≤ 2 n\le 2 n2的情况,否则可能会出现负数!

#include <cstdio>
using namespace std;

using LL = long long;
int n;

inline int max(int x, int y) { return x > y? x: y; }
inline int min(int x, int y) { return x < y? x: y; }

inline LL f(LL n) { return n-- > 2? n * (n - 1LL) >> 1LL: 0LL; }
inline LL count(int s) { return f(s) - 3 * (f(s - n) - f(s - (n << 1))); }

int main()
{
	LL k;
	scanf("%d%lld", &n, &k);
	int lim = n * 3;
	for(int sum=3; sum<=lim; sum++)
	{
		LL cnt = count(sum);
		if(k > cnt) { k -= cnt; continue; }
		for(int a=1; a<=n; a++)
		{
			int minb = max(1, sum - a - n), maxb = min(n, sum - a - 1);
			if(minb > maxb) continue;
			int num = maxb - minb + 1;
			if(k <= num)
			{
				int b = minb + k - 1;
				int c = sum - a - b;
				printf("%d %d %d\n", a, b, c);
				return 0;
			}
			k -= num;
		}
	}
	return 0;
}
### 回答1: Kyocera Client Tool 是一个用于管理 Kyocera 打印机和复印机的软件。要安装它,您需要先下载安装文件,然后双击文件运行安装程序。根据您使用的操作系统,安装过程可能会略有不同。在安装过程中,您可能需要输入序列号或许可证密钥。安装完成后,您可以使用该工具来管理您的打印机和复印机。 ### 回答2: Kyocera Client Tool(客户端工具)是一款用于访问和配置Kyocera复印机/打印机的工具。它可以帮助用户管理打印机,以便更好地满足他们的需求。这个工具包括了许多有用的功能,比如可以远程监控打印机的状态和保护打印机中存储的敏感信息。 安装Kyocera Client Tool很容易。首先,用户需要从Kyocera的官方网站上下载最新版本的安装程序。安装程序通常会以可执行文件格式提供,用户只需双击该文件即可开始安装。在安装过程中,用户需要按照提示逐步操作。其中包括同意许可协议,选择安装路径,选择安装组件等等。 安装完成后,用户需要打开Kyocera Client Tool并对其进行配置。用户需要输入Kyocera打印机的IP地址或主机名,然后使用默认或自定义的凭据进行身份验证以访问打印机。在成功连接到打印机后,用户可以使用Kyocera Client Tool来管理和监控打印机,例如,可以查看打印机的硬件和软件配置信息,设置打印机的打印选项,查看打印机的状态和错误日志等等。 总之,Kyocera Client Tool是一款非常实用的工具,可以帮助用户更好地管理和监控Kyocera打印机。它的安装和配置十分简单,只需按照提示即可完成。希望这篇回答能对你有所帮助。 ### 回答3: Kyocera client tool(以下简称KCT)是一款Kyocera复合机的管理软件,可以帮助管理员轻松地管理Kyocera复合机的配置、维护、监视和诊断等操作。这里将介绍KCT的安装过程。 首先,去Kyocera官网下载KCT。下载完成后,双击安装程序开始安装。安装过程中可能需要输入管理员权限,如有需要请进行授权。安装程序将自动安装KCT到默认文件夹下(一般是C:\Program Files (x86)\Kyocera\Client Tool)。安装过程将涉及到KCT所需的依赖库,如未安装,需要按照提示安装。 安装完成后,可以在开始菜单中找到KCT的快捷方式。首次运行需要进行设置,包括复合机的IP地址、通信端口、管理员账户等。设置完成后,KCT将根据设置自动与复合机建立连接。 KCT的主界面分为多个标签页,包括“状态监视”、“配置管理”、“设备维护”和“诊断”,每个标签页提供了不同的管理功能。在“状态监视”标签页中,可以查看复合机的基本状态信息,如打印作业、传输作业等。在“配置管理”标签页中,可以进行复合机的基础配置管理,如修改IP地址、设置安全选项等。在“设备维护”标签页中,可以查看设备日志、维护计划等设备信息。在“诊断”标签页中,则可以进行设备问题的快速排查。 需要注意的是,KCT只能应用于Kyocera品牌的复合机。安装过程中如果遇到问题,可以参考Kyocera官网提供的技术支持文档,或者联系Kyocera的技术支持人员。同时,使用KCT需要管理员账户,并且建议仅授权给合适的人员使用,以确保复合机的安全管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值