YACS(上海市计算机学会竞赛平台)二星级挑战——三倍子串

题目描述

给定一个十进制正整数 n,请问可以从 n 中截取多少种不同的子串,使得子串构成的数字是 3 的倍数。

例如:当n=1234 时,有且仅有 3,12,123,234 这四个子串是 3 的倍数。

输入格式

单个整数:表示输入的数字 n

输出格式

单个整数:表示 3 的倍数的子串数量。

数据范围

样例数据

输入:

95764

输出:

6

说明:

子串6,9,57,576,957,9576是3的倍数

输入:

1111

输出:

2

说明:

有两个111都是3的倍数

主要思想 

1.80%(至于为什么是80%,是因为数据不太严谨)

首先定义string,因为C++中没有数据类型能定义10^{1000}

然后开一个数组,表示每一位数字。

算每一位数字的和,用前缀和来求。

运用数学特性(如果A\div 3=x\cdots n,B\div 3= y \cdots n (n\leqslant 2 \geqslant 0),那么(A-B)\div 3=z\cdots 0),如果(a[j]-a[i])%3==0,cnt++。

80% 代码
#include <bits/stdc++.h>
using namespace std;
int a[100005];
string s;
int cnt;

int main() {
	cin >> s;
	int len = s.length();
	for (int i = 0; i < len; i++) {
		a[i + 1] = a[i] + s[i] - '0'; //算前缀和
	}
	for (int i = 0; i <= len; i++) {
		for (int j = i + 1; j <= len; j++) {
			if ((a[j] - a[i]) % 3 == 0) {
				cnt++;//如果是3的倍数,cnt增加1
			}
		}
	}
	cout << cnt;
	return 0;
}
2.AC代码的养成记

1.用long long

2.余1的和余1的相减,结果余0,余2的也如此,余0的可以与余0的相减,得0,还可以自己减自己,余0

代码实现

#include <bits/stdc++.h>
using namespace std;
long long a[100005];
long long y[3];
string s;
long long ans;
//整体思想:运用前缀和,再运用数学特点*,求出答案
//*:如果A÷3=x...2,B÷3=y...2,那么A-B一定是3的倍数
int main() {
	cin >> s;
	int len = s.length();
	for (int i = 0; i < len; i++) {
		a[i + 1] = a[i] + s[i] - '0'; //算前缀和
		y[a[i + 1] % 3]++;
	}
	ans = y[1] * (y[1] - 1) / 2 + y[2] * (y[2] - 1) / 2 + y[0] * (y[0] - 1) / 2 +
	      y[0]; //余1的和余1的相减,结果余0,余2的也如此,余0的可以与余0的相减,得0,还可以自己减自己,余0
	cout << ans;
	return 0;
}

上海市青少年算法竞赛YACS)是上海市面向青少年举办的一项竞赛活动。这个竞赛旨在提供给青少年一个展示和提升他们算法能力的平台YACS竞赛设有多个不同级别的组别,包括初级、中级和高级组。每个组别的参赛者按照一定的选拔方式进行参赛,确保参赛者能够在相对适合的级别中进行竞争。竞赛内容包括各类算法问题的解题,包括搜索、排序、图论等等,涵盖了计算机科学中的基础知识和技巧。参赛者在规定的时间内解答尽可能多的问题,并根据正确性、效率和创新性等多个维度进行评分。 YACS竞赛不仅提供了一个交流和比拼的平台,还对青少年算法能力的发展有着积极的推动作用。通过这个竞赛,学生们可以在实践中加深对算法的理解,并且学习如何将算法应用于解决实际问题。而且,竞赛中的参赛经验也可以在日后的学习和工作中发挥重要的作用。 此外,YACS竞赛还为优秀的参赛者提供了一系列的奖项和机会。例如,获得比赛高分的学生有可能获得奖章、荣誉证书和奖金等奖励;而表现出色的选手还有机会代表上海市参加国内外的算法竞赛,与来自不同地区的青少年进行交流和比拼。 总之,上海市青少年算法竞赛YACS)不仅具有促进青少年算法能力发展的功能,还为他们提供了一个展示和提升自己的平台。通过参与这个竞赛,青少年可以锻炼解决问题的能力、培养创新思维,为未来的学习和职业发展打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值