1

AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 435

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:AtCoder Beginner Contest竞赛题解 | 汇总


A - Triangular Number

【题目来源】

洛谷:[AT_abc435_a ABC435A] Triangular Number - 洛谷

【题目描述】

给定一个正整数 \(N\)
请输出从 \(1\)\(N\) 的所有整数之和,即 \(1+2+\cdots+N\)

【输入】

从标准输入中读取一行,格式如下:

\(N\)

【输出】

输出从 \(1\)\(N\) 的所有整数之和。

【输入样例】

5

【输出样例】

15

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int n;  // 输入的正整数n

int main()
{
    // 输入正整数n
    cin >> n;
    
    // 计算1到n的和,并输出结果
    // 公式:S = n(n+1)/2
    cout << (n + 1) * n / 2 << endl;
    
    return 0;
}

【运行结果】

5
15

B - No-Divisible Range

【题目来源】

洛谷:[AT_abc435_b ABC435B] No-Divisible Range - 洛谷

【题目描述】

给定一个长度为 \(N\) 的正整数序列 \(A=(A_1,A_2,\ldots,A_N)\)

请你求出有多少对整数 \((l,r)\) 满足 \(1\leq l\leq r\leq N\),并且满足以下条件:

对于每一个满足 \(l\leq i\leq r\) 的整数 \(i\)\(A_i\) 不是 \(A_l+A_{l+1}+\cdots+A_r\) 的约数。

【输入】

输入从标准输入中读入,格式如下:

\(N\) \(A_1\) \(A_2\) $ \ldots $ \(A_N\)

【输出】

输出满足条件的对数。

【输入样例】

5
8 6 10 5 7

【输出样例】

6

【算法标签】

《洛谷 AT_abc435_b No-Divisible Range》 #枚举#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 55;  // 最大数组长度
int n;             // 数组长度
int ans;           // 答案:符合条件的区间数量
int a[N];          // 原始数组
int sa[N];         // 前缀和数组,sa[i]=a[1]+a[2]+...+a[i]

/**
 * 检查区间[l,r]的和是否能被区间内任意一个数整除
 * @param res 区间和
 * @param l 区间左端点
 * @param r 区间右端点
 * @return 如果区间和不能被区间内任意数整除,返回true;否则返回false
 */
bool check(int res, int l, int r)
{
    // 遍历区间[l,r]内的每个数
    for (int i = l; i <= r; i++)
    {
        // 如果区间和能被a[i]整除,则不符合条件
        if (res % a[i] == 0)
        {
            return false;
        }
    }
    // 区间和不能被区间内任意数整除
    return true;
}

int main()
{
    // 输入数组长度
    cin >> n;
    
    // 输入数组并计算前缀和
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        sa[i] = sa[i - 1] + a[i];  // 前缀和
    }
    
    // 枚举所有区间[i,j]
    for (int i = 1; i <= n; i++)
    {
        for (int j = i; j <= n; j++)
        {
            // 计算区间[i,j]的和
            int tot = sa[j] - sa[i - 1];
            
            // 调试输出
            // cout << "tot " << tot << endl;
            
            // 检查区间和是否能被区间内任意数整除
            if (!check(tot, i, j))
            {
                continue;  // 不符合条件,跳过
            }
            
            // 调试输出
            // cout << "i j " << i << " " << j << endl;
            
            // 符合条件,计数加1
            ans++;
        }
    }
    
    // 输出结果
    cout << ans << endl;
    
    return 0;
}

【运行结果】

5
8 6 10 5 7
6
posted @ 2026-01-18 10:51  热爱编程的通信人  阅读(2)  评论(0)    收藏  举报