当前位置: 首页 > news >正文

CF1305C Kuroni and Impossible Calculation

题目大意

给定一个长度为 n 的数组,数组元素互不相同,输出所有满足 1 <= i < j <=n 的| a[i] - a[j] |的乘积对m取模后的结果。

题目分析

一开始可能没什么思路,想到暴力。但是,2e5的数据范围,用暴力的O(n^{2})肯定是无法做到的。

(对于数学比较好的同学,可以看一下这一段;但是,正解在这一段后面,此处只列出一种可能性)那么,我们对乘法的式子进行一下分析,发现,它符合范德蒙行列式:

那么,就可以考虑用FFT(快速傅里叶变换)或其他快速多项式算法,将时间复杂度压缩到O(nlogn),那么应该就能做了。

但是,作者数学不太好(恼),没有办法优化时间复杂度,那就只能优化数据范围了。

首先,对于数组a中的元素,如果存在任意 i ,j 满足| a[i] - a[j] |%m等于0,那么,不管其他情况如何,最终结果一定是0。所以,只要在输入的时候,判断一下,有没有两个元素对m取模后的结果相同(即,差为m的倍数)的情况,有则输出0,反之则暴力计算即可。

为什么加上这个条件,就可以暴力了呢?

注意到,任意一个数对m的取模结果必然在[0,m-1]区间内,也就是有m种可能性。那么,当数组大小n大于m时,必然存在一个值满足至少为两个数组元素取模后的结果,即存在i ,j 满足| a[i] - a[j] |%m等于0,那么最终答案一定为0。也就是说,我们只需要暴力运算 n < m 的情况,即把数据压缩到了1e3的范围,这个就可以用暴力的方法计算了。

代码实现

#include <iostream>
using namespace std;
int n, m, a[200010];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++)cin >> a[i];
    if (n > m)cout << "0";//如果n > m则答案为0,反之暴力运算
    else {
        long long ans = 1;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                ans = (ans * abs(a[i] - a[j])) % m;
            }
        }
        cout << ans;
    }
}

相关文章:

  • AI人工智能机器学习之监督学习和集成学习
  • W803|联盛德|WM IoT SDK2.X测试|(1)开箱:开发板及说明
  • Java Junit框架
  • 【11】RUST使用cargo组织crate
  • 物理先验+数据增强的蛋白-小分子亲和力打分模型 EquiScore 评测
  • 示例:JAVA调用deepseek
  • 机试刷题_674. 最长连续递增序列【python】
  • DevSecOps普及:安全与开发运维的深度融合
  • vllm的使用方式,入门教程
  • 技术速递|.NET 9 网络优化
  • [已解决]dify设置本地模型deepseek报错[Error 111]
  • vue深拷贝:1、使用JSON.parse()和JSON.stringify();2、使用Lodash库;3、使用深拷贝函数(采用递归的方式)
  • MemoryCache内存缓存数据
  • 算法仿真平台搭建1-FFMPEG+RtspSever快速搭建一个RTSP服务器
  • 【苍穹外卖】问题笔记
  • Pytorch框架06-现有网络模型(修改/使用/保存/加载)
  • Ubuntu 安装 Nginx并配置反向代理
  • 工作中遇到的设计模式整理
  • Uniapp 小程序接口封装与使用
  • 使用 Postman 访问 Keycloak 端点
  • 国家发改委:建立实施育儿补贴制度
  • 油电同智,安全超充!从上海车展看中国汽车产业先发优势
  • 从 “沪惠保” 到 “沪骑保”看普惠保险的 “上海样式”
  • 凝聚多方力量,中国农科院油菜产业专家团部署单产提升新任务
  • 伊朗最大港口爆炸:26公里外都能听到,超七百人受伤,原因指向化学品储存
  • 手机号旧机主信用卡欠款、新机主被催收骚扰四年,光大银行济南分行回应