第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)

这篇具有很好参考价值的文章主要介绍了第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.近似GCD

1.题目描述

小蓝有一个长度为 n n n 的数组 A = ( a 1 , a 2 , ⋯   , a n ) A=\left(a_{1}, a_{2}, \cdots, a_{n}\right) A=(a1,a2,,an), 数组的子数组被定义为从 原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数 组中所有元素的最大公约数。如果最多更改数组中的一个元素之后, 数组的最 大公约数为 g g g, 那么称 g g g 为这个数组的近似 GCD。一个数组的近似 GCD 可能 有多种取值。

具体的, 判断 g g g 是否为一个子数组的近似 GCD 如下:

如果这个子数组的最大公约数就是 g g g, 那么说明 g g g 是其近似 GCD。

在修改这个子数组中的一个元素之后 (可以改成想要的任何值), 子数 组的最大公约数为 g g g, 那么说明 g g g 是这个子数组的近似 GCD。

小蓝想知道, 数组 A ​ A​ A 有多少个长度大于等于 2 的子数组满足近似 GCD 的值为 g ​ g​ g.

2.输入格式

输入的第一行包含两个整数 n , g n,g n,g,用一个空格分隔,分别表示数组 A A A 的长度和 g g g 的值。
第二行包含 n n n 个正数 a 1 , a 2 , ⋯ , a n , a_1,a_2,⋯,a_n, a1,a2,,an, 相邻两个整数之间用一个空格分隔。

3.输出格式

输出一行包含一个整数表示数组 A A A 有多少个长度大于等于 2 的子数组的近 似 GCD 的值为 g g g

4.样例输入

5 3
1 3 6 4 10

5.样例输出

5

6.数据范围

2 ≤ n ≤ 1 0 5 , 1 ≤ g , a i ≤ 1 0 9 。 2≤n≤10^5,1≤g,ai≤10^9。 2n105,1g,ai109

7.原题链接

近似GCD

2.解题思路

首先,如果一个数是g的倍数,那我们称其为符合条件的数。如果一个数组的近似GCD为 g g g,那么该数组最多只能有一个数不符合条件。为什么呢?因为如果只有一个不符合条件的数话,我们将其变为g,那么该数组的GCD将为g。如果数组全部符合条件呢?那我们只需要随便将其中一个数变为g,该数组的GCD也将为g

那么现在问题就转换为存在多少个长度大于2的子数组使得子数组内最多只存在一个不符合条件的数,这个问题我们可以使用双指针解决。右指针r遍历数组的每一个数,左指针l将是以r将作为子数组的右端点的情况下,左端点能最远能到达的距离,也就是使得 [ l , r ] [l,r] [l,r]区间最多只存在一个不符合条件的数,且 l l l r r r 之间的距离尽可能长。这样的话,数组 [ l , r ] [l,r] [l,r], [ l + 1 , r ] [l+1,r] [l+1,r], [ l + 2 , r ] [l+2,r] [l+2,r] [ r − 1 , r ] [r-1,r] [r1,r]都是符合条件的答案,总共是r-l个。对于数组的每一个数我们都将其作为r后,累加答案即可。

我们考虑变换数组的值,如果其是符合条件的数,我们将其值赋为1,否则赋为0,对于区间 [ l , r ] [l,r] [l,r]是否为符合条件的子数组,只需要判断 s u m [ l , r ] sum[l,r] sum[l,r]是否大于等于 r − l r-l rl。求区间和 s u m sum sum,我们可以使用前缀和数组直接获取,但由于是双指针,也可以同时维护,这里代码使用了前缀和数组。

时间复杂度: O ( n ) O(n) O(n)文章来源地址https://www.toymoban.com/news/detail-795216.html

3.Ac_code

1.C++

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 200010;

int n, g;
void solve()
{
	cin >> n >> g;
	std::vector<int> a(n + 1);
	for (int i = 1; i <= n; ++i) {
		int x;
		cin >> x;
		a[i] = (x % g == 0);
		a[i] += a[i - 1];
	}
	int l = 0;
	LL ans = 0;
	for (int r = 2; r <= n; ++r) {
		while (l + 1 < r && a[r] - a[l] < r - l - 1) l++;
		ans += r - l -1;
	}
	cout << ans << '\n';
}
int main()
{
	ios_base :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}

2.Python

n,g=map(int,input().split())
a=list(map(int,input().split()))
a=[0]+a
ans=0#记录上一个不符合条件的数
last=0#记录符合条件子数组的左区间
l=1
for r in range(1,n+1):
    if a[r]%g!=0:
        l=last+1
        last=r
    ans=ans+(r-l)
print(ans)

到了这里,关于第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯第十三届单片机国赛程序

    写在前面: 做完总体来说感觉一年比一年难了(估计是被骂的),虽然十三届用的底层少,但是做起来困难重重。 最难的难点在于定时器安排问题。15F2K60S2系列单片机只有三个定时器,本届题目考到了频率测量、超声波、PWM输出,再加上刷新,每一个都需要一个定时器,比

    2024年02月08日
    浏览(38)
  • 蓝桥杯单片机第十三届国赛客观题(深夜学习——单片机)

    1.填空题 (2)不同的地址范围: data:0x00-0xff idata:0x0000-0xffff xdata:0x0000-0xffff pdata:0x00-0xff code:0x0000-0xffff 2.选择题 (3)模电——》多级放大电路 (6)DS18B20 (7)模电——》二极管  (8)单片机      

    2024年02月11日
    浏览(42)
  • 第十三届蓝桥杯Java B 组国赛 C 题——左移右移(AC)

    小蓝有一个长度为 N N N 的数组, 初始时从左到右依次是 1 , 2 , 3 , … N 1,2,3, ldots N 1 , 2 , 3 , … N 。 之后小蓝对这个数组进行了 M M M 次操作, 每次操作可能是以下 2 种之一: 左移 x x x , 即把 x x x 移动到最左边。 右移 x x x , 即把 x x x 移动到最右边。 请你回答经过 M M M 次操作之后

    2024年02月02日
    浏览(36)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

      本届国赛试题主要包含 LCD 、 LED 、 按键 、 EEPROM 、 串口 、 模拟电压输入 、 脉冲输入输出 七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考部分),而剩下的四个部分都为“干儿子”(考频相对较高)。   相对于本届省赛两套试题:   本套试题 串口数

    2024年02月02日
    浏览(52)
  • 2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解

    2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解 补题链接:地址 两个填空题说实话感觉非常花时间。 第1题 —— 2022 (5分) 题意:将2022拆成10个数相加,有多少方案。 思路:划分dp经典题,数字i划分成j个数。 答案:379187662194355221 第2题 —— 钟表 (5分) 题意

    2024年02月04日
    浏览(29)
  • 第十三届蓝桥杯嵌入式国赛真题(基于HAL库的巨简代码+超级详解)

    相关说明: 开发板:CT117E-M4(STM32G431RBT6) 开发环境: CubeMX+Keil5 涉及题目:第十三届蓝桥杯嵌入式国赛真题 难点:双路AD测量电压、输入捕获测频率、LCD屏幕翻转、冒泡法、初始上电判断、按键长短按 CubeMX配置、主要函数代码及说明: 1.使能外部高速时钟: 2.配置时钟树:

    2023年04月09日
    浏览(43)
  • 第十三届蓝桥杯省赛与国赛真题题解大汇总(十四届参赛者必备)

      大家好,我是执梗。本文汇总了我写的第十三届蓝桥杯所有省赛真题与国赛真题,会针对每道题打出我自己的难度评星⭐️,也会给出每道题的算法标签,帮助大家更有针对性的去学习和准备,当然许多题目由于难度或时间的原因暂未更新,如果有不懂的问题也可以在评

    2024年02月11日
    浏览(64)
  • 第十三届蓝桥杯省赛Python 组

    本次所有代码均存放于仓库: Github :GxlHus/Algorithm at 蓝桥杯 (github.com) Gitee :Algorithm: 算法解题 - Gitee.com 原题目:第十三届蓝桥杯大赛软件赛省赛_PB.pdf · AYO/Algorithm - Gitee.com 本次省赛题目总体来说不难,总体质量比较高,尤其是后边几道题,虽然能轻易做出来,但是想跑通所

    2023年04月17日
    浏览(27)
  • 第十一届蓝桥杯国赛JavaB组题解

    思路: 枚举 1 到 2020 的每个数,依次判断即可。 代码: 解法一:(比较慢但是容易想) b f s bfs b f s ,先将给出的点加入队列中,并且加到集合里。记录扩散的步数,初始化为2020,然后对队列中的每一个同一层的节点在四个方向上扩散,当扩散的点不在集合里时,把它加到

    2024年02月08日
    浏览(34)
  • 第十二届蓝桥杯国赛试题及解析

    第一题 *选择题严禁使用程序验证设s =HiLanQiao\\\',运行以下哪个选项代码可以输出“LanQiao”子串( A )。 A、print(s[-7:]) B、print(s/-6:-11) C、print(s1-7:01) D、print(s[-7:-1]) 第二题 *选择题严禁使用程序验证已知a=2021.0529,运行以下哪个选项代码可以输出“2021.05” ( B )A、print( .2f1\\\'.format(a

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包