《P10263 [GESP202403 八级] 公倍数问题》

题目背景

对应的选择、判断题:试题 - GESP 202403 C++ 八级 - 洛谷有题

题目描述

小 A 写了一个 N×M 的矩阵 A,我们看不到这个矩阵,但我们可以知道,其中第 i 行第 j 列的元素 Ai,j​ 是 i 和 j 的公倍数(i=1,...,N,j=1,...,M)。现在有 K 个小朋友,其中第 k 个小朋友想知道,矩阵 A 中最多有多少个元素可以是 k(k=1,2,...,K)。请你帮助这些小朋友求解。

注意:每位小朋友的答案互不相关,例如,有些位置既可能是 x,又可能是 y,则它同时可以满足 x,y 两名小朋友的要求。

方便起见,你只需要输出 ∑k=1K​k×ansk​ 即可,其中 ansk​ 表示第 k 名小朋友感兴趣的答案。

输入格式

第一行三个正整数 N,M,K。

输出格式

输出一行,即 ∑k=1K​k×ansk​。

请注意,这个数可能很大,使用 C++ 语言的选手请酌情使用 long long 等数据类型存储答案。

输入输出样例

输入 #1复制

复制代码
2 5 2

输出 #1复制

复制代码
9

输入 #2复制

复制代码
100 100 100

输出 #2复制

复制代码
185233

说明/提示

样例 1 解释

只有 A1,1​ 可以是 1,其余都不行。

A1,1​,A1,2​,A2,1​,A2,2​ 都可以是 2,而其余不行。

因此答案是 1×1+2×4=9。

数据规模

对于 30% 的测试点,保证 N,M,K≤10;

对于 60% 的测试点,保证 N,M,K≤500;

对于 100% 的测试点,保证 N,M≤105,K≤106。

代码实现:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXK = 1e6 + 10;
int d[MAXK], e[MAXK];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M, K;
    cin >> N >> M >> K;
    for(int i = 1; i <= N; i++)
    {
        for(int k = i; k <= K; k += i)
        {
            d[k]++;
        }
    }
    for(int j = 1; j <= M; j++)
    {
        for(int k = j; k <= K; k += j)
        {
            e[k]++;
        }
    }
    ll ans = 0;
    for(int k = 1; k <= K; k++)
    {
        ans += 1LL * k * d[k] * e[k];
    }
    cout << ans << '\n';
    return 0;
}
相关推荐
朝朝辞暮i2 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
青梅橘子皮2 小时前
Blue---二分算法(二分查找与二分答案)
算法
长河3 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
月光船幽幽3 小时前
加性偏移外推提升参数识别可靠性
python·算法
Ivanqhz4 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
不会就选b4 小时前
算法日常・每日刷题--<动态规划>3
数据结构·算法
-dzk-5 小时前
【堆】LC 347.前 K 个高频元素
算法·堆
H.莓飛5 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia6265 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
和裕6 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法