C程序训练:两个数组按规则结合形成一个集合

题目描述: 小花有一个数组A,小树有一个数组B。小花和小树的关系很好,他们希望合并手中的数组,得到新的集合C={a+b|a∈A, b∈B}。

输入格式:第一行输入两个整数N,M,分别表示数组A,B的长度。第二行包含N个整数,表示数组A。第三行包含M个整数,表示数组B。

  (0 ≤ N,M ≤ 2 *10^5, 0 ≤ A[i],B[i] ≤ 2 * 10^6)

输出格式:输出一个整数,表示C的元素个数。

输入样例:

10 10

12 14 0 2 2 15 26 17 8 44

1 4 6 10 22 13 19 50 39 0

输出样例:

56

注意:本题时间限制较严格,由于暴力解法时间复杂度为O(n^2),可能无法满足本题要求,因此请尽可能优化你的算法( 6000ms,512MB)。

分析:我们首先想到的算法就是暴力解法,用双重循环实现。源程序如下:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void)
{int n, m;scanf("%d %d", &n, &m);int* arrl=(int*)malloc(sizeof(int) * n);int* arr2=(int*)malloc(sizeof(int) * n);if (arrl==NULL || arr2 == NULL) return 1;  for (int i = 0; i < n; ++i)  {scanf("%d",&arrl[i]);}for(int i = 0; i< m; ++i) {scanf("%d",&arr2[i]);}char* check =(char*)malloc(sizeof(char) * 4000001);if (check == NULL) return 1;memset (check, 0, sizeof(char) * 4000001);int count= 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j)  {check[arrl[i] + arr2[j]]=1;    }}for(int i=0; i< 4000001; i++){count += check[i];}printf("%d\n",count);return 0;
}

暴力算法虽然简单,但数据量大时,运行时间会超时,因为算法的时间复杂度为O(n^2),无法满足题目要求。因此,必须找到一种解决方案。因此有网友提出一种方案,使用傅里叶变换实现。

设A数组[0, 1, 3, 5, 6]中的元素可看成多项式(1+x+x^3+x^5+x^6)的系数,B数组中[2,3,4]中的元素可看成多项式(x^2+x^3+x^4)的系数。计算这两个多项式的乘法(1+x+x^3+x^5+x^6)*(x^2+x^3+x^4),然后看结果中哪些项前面有系数,统计有系数项的个数,即为所求答案。

使用快速傅里叶变换进行多项式乘法运算,其时间复杂度为O(nlogn),应能满足题目要求。源程序如下。


#include <stdio.h>
#define LLONG long long
#define MAXN  (1<<23)
#define mod 998244353 //质数,在编程中常被用来做模数
int id[MAXN];
int a[ MAXN],b[ MAXN];
int quickpow(int x, int b)
{LLONG ans=1,t=x;while(b){if(b&1) ans=ans*t%mod;t=t*t%mod;b>>=1;}return ans;
}
int init(int len)
{int lim=1;while(lim<=len)  {lim<<=1;}for(int i=1; i<lim; i++){id[i] = (id[i>>1]>>1)+(i&1)*(lim>>1);}return lim;
}
void NTT(int a[],int lim, int opt)
{for(int i=1; i<lim; i++){if(i<id[i])  {int step = a[i];a[i] = a[id[i]];a[id[i]] = step;}}for(int len=2; len<=lim; len<<=1)  {int k=len>>1;int wn=quickpow(3,(mod-1)/len);for(int i=0; i<lim; i+=len){LLONG g=1;for(int j=0; j<k; j++,g=g*wn%mod){int temp=a[i+j+k]*g%mod;a[i+j+k]=(mod-temp+a[i+j])%mod;a[i+j]=(a[i+j]+temp)%mod;}}}if(opt==-1)  {    for (int i = 0; i < lim; i++){int temp = a[i+1];a[i+1] = a[lim - i];a[lim - i] = temp;}LLONG inv=quickpow(lim,mod-2);for(int i=0; i<lim; i++)  {a[i]=a[i]*inv%mod;}}return;
}
int main()
{int n,m,lim=0;int x,i;scanf("%d%d",&n,&m);for(i=1; i<=n; i++)  {scanf("%d",&x);a[x]=1;if(x>lim)lim=x;}for(i=1; i<=m; i++)  {scanf("%d",&x);b[x]=1;if(x>lim)lim=x;}lim = init(lim<<1);NTT(a,lim,1);NTT(b,lim,1);LLONG step;for(i=0; i<lim; i++){step = a[i];a[i]=step*b[i]%mod;}NTT(a,lim,-1);    for(i=0,n=0; i<lim; i++)  {if(a[i]) n++;}printf("%d",n);return 0;
}

参考文献:

[1]https://tieba.baidu.com/p/8844914020

[2]百度网盘资源下载网址

https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc

[3]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2023.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02-k8s学习笔记之相关组件

1、控制面板组件&#xff08;Master&#xff09; kube-apiserver API 服务器是 Kubernetes 控制平面的组件&#xff0c; 该组件负责公开了 Kubernetes API&#xff0c; 负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。kube-controller-manager kube-con…

从第一性原理看大模型Agent技术

本文由下面的内部分享视频文字稿重新整理而成 从第一性原理看大模型Agent技术 引 一个乐观主义者的悲观估计 随着大规模模型技术的兴起&#xff0c;我们正处于一个崭新的智能时代的黎明。我们有一个大胆的预测&#xff0c;未来的5到10年将可能带来一场大变局&#xff1a;99%的…

node.js笔记(2)

fs模块是node.js官方提供的&#xff0c;用来操作文件的模块&#xff0c;提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 在使用之前&#xff0c;需要导入&#xff0c;使用require方法来导入 const fs require(fs) 读取指定文件的内容 fs.readFile(pa…

效率交响曲:AIOps 协调卓越运营

作者&#xff1a;来自 Elastic Priscilla_Parodi ​ 在我们探索 AIOps 之前&#xff0c;让我们先澄清一些与不同 Ops 的一些单并非全部相关的关键概念&#xff1a; 1&#xff09;DevOps&#xff1a;开发运维 你可能已经听说过 DevOps。 它是一种通过协作和自动化促进交付来集…

AtCoder Beginner Contest 336 A-E 题解

比赛链接&#xff1a;https://atcoder.jp/contests/abc336比赛时间&#xff1a;2024 年 1 月 14 日 20:00-21:40 A题&#xff1a;Long Loong 标签&#xff1a;模拟题意&#xff1a;给定一个 n n n&#xff0c;输出 L L L、 n n n个 o o o和 n g ng ng。题解&#xff1a;按题意…

批评与自我批评组织生活会发言材料2024年六个方面

生活就像一场马拉松&#xff0c;成功需要坚持不懈的奔跑。每一步都可能会遇到挫折和困难&#xff0c;但只要你努力向前&#xff0c;坚持不放弃&#xff0c;你就一定能够迎接胜利的喜悦。不要害怕失败&#xff0c;因为失败是成功的垫脚石。相信自己的能力&#xff0c;追求自己的…

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化&#xff1f; 数据可视化通过将数据整理成更容易理解的格式来讲述故事&#xff0c;凸显趋势和异常点。好的可视化能够讲述一个故…

生物信息学及其研究方向与应用

生物信息学是生物er在AI以及cs时代的出路&#xff0c;所以AI以及生信一定是生物er的出路&#xff0c;21世纪的生物只有和最具生产力的行业结合&#xff0c;才能爆发出生命力&#xff0c;哦不&#xff0c;拿到高薪。 生物信息学可以理解为“生物”“信息学”&#xff0c;但不是…

GB/T28181介绍

GB/T 28181是中华人民共和国国家标准中关于视频监控设备通信协议的规范&#xff0c;它提供了一种用于视频监控系统之间通信的标准化平台。以下是GB/T 28181规范的概述&#xff1a; 1. 标准背景 GB/T 28181标准的制定旨在解决不同厂商生产的视频监控设备之间的互联互通问题&am…

MySQL隐藏密码之mysql_config_editor

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. mysql_config_editor介绍 mysql_config_editor是一个MySQL自带的一款用于安全加密登录的工具&#xff0c;使用这个工具&…

C#中实现UDP打洞

在C#中实现UDP打洞&#xff08;NAT Traversal&#xff09;的基本原理是利用STUN&#xff08;Session Traversal Utilities for NAT&#xff09;服务器获取客户端的公网地址和端口信息&#xff0c;然后通过互相交换这些信息&#xff0c;使得两个位于不同NAT环境下的客户端可以通…

STM8入门|第一个工程

开发软件 不支持Keil&#xff0c;使用IAR for STM8&#xff0c;注意 IAR系列有很多种 STM8对应软件是 IAR for STM8 软件下载&#xff1a; 官网下载地址&#xff0c;官网版本下载比较麻烦&#xff0c;可以按教程网盘地址下载。 下载安装教程&#xff1a; https://www.cnblogs…

系统界面风格和布局设置,Launcher

不同系统版本的有不同的界面风格和布局设置&#xff0c;那么这个工作任务牵扯到android的哪一层次&#xff0c;应用层可以解决吗 这个问题涉及到 Android 系统的不同层次。Android 系统的架构可以分为四个主要层次&#xff1a;应用层、应用框架层、系统运行库层和 Linux 内核层…

4. Mybatis 事务和Spring事务关系

大体上分为两种情况&#xff1a;方法上添加了事务注解Transactional 和方法上没有添加事务注解Transactional。 添加了Transactional 注解的在注入 bean 的时候就会被创建代理类&#xff0c;在代理类中使用增强逻辑进行事务处理。没有添加Transactional 注解的&#xff0c;在 …

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

如何打赢稳定性之战?

文章目录 前言为什么总会出现问题呢&#xff1f;如何证明你的稳定性做的有效果&#xff1f;既是持久战&#xff0c;也是防御战1. 提前建筑好防御工事2. 以攻为守3. 找外部支援和配合 前言 随着23年年末期间&#xff0c;各大厂争先恐后的出现的各种线上故障&#xff0c;一时间“…

帆软使用总结-动态分组背景变色

1.开发界面设计 提示&#xff1a; ROUNDUP((ROW() - M) / N, 0) % 2 0row() 获取当前行号 M 标题行数 N 间隔行数 ROUNDUP() 向上取整 如果被2整除&#xff0c;改变背景颜色 当前公式&#xff1a;ROUNDUP((ROW() - 2) / 3, 0) % 2 02.效果演示

Python while循环实现猜字谜游戏

python的while更多地应用于程序的一般性循环&#xff0c;而不是遍历迭代对象。与其他的计算机编程语言不同&#xff0c;python没有do...while这样的while循环。接下来&#xff0c;我们将详细介绍一下Python的while循环&#xff0c;并用寥寥数行代码开发一个小游戏&#xff0c;作…

【题解】—— 每日一道题目栏

2024.1 【题解】—— LeetCode一周小结1 1. 1599. 经营摩天轮的最大利润 2. 466. 统计重复个数 3. 2487. 从链表中移除节点 4. 2397. 被列覆盖的最多行数 5. 1944. 队列中可以看到的人数 6. 2807. 在链表中插入最大公约数 7. 383. 赎金信 【题解】—— LeetCode一周小…