算法_三元组的数量

简介: {5 3 1}和{7 5 3}是2组不同的等差三元组,除了等差的性质之外,还有个奇妙的地方在于:5^2 – 3^2 – 1^2 = 7^2 – 5^2 – 3^2 = N = 15。

{5 3 1}和{7 5 3}是2组不同的等差三元组,除了等差的性质之外,还有个奇妙的地方在于:5^2 – 3^2 – 1^2 = 7^2 – 5^2 – 3^2 = N = 15。

{19 15 11}同{7 5 3}这对三元组也存在同样的性质:19^2 – 15^2 – 11^2 = 7^2 – 5^2 – 3^2 = N = 15。

这种成对的三元组还有很多。当N = 15时,有3对,分别是{5 3 1}和{7 5 3},{5 3 1}和{19 15 11},{7 5 3}和{19 15 11}。


现给出一个区间 [a,b]求a <= N <= b 范围内,共有多少对这样的三元组。(1 <= a <= b <= 5*10^6)

例如:a = 1,b = 30,输出:4。(注:共有4对,{5 3 1}和{7 5 3},{5 3 1}和{19 15 11},{7 5 3}和{19 15 11},{34 27 20}和{12 9 6}) 

我的解法:

(1)首先为a到b的每个N值设置一个统计量,可以通过数组实现;

(2)三元组由起始值x和等差确定,即 x,x+d,x+2d,我们可以通过统计x和d来求得N,并将相应的统计量+1;

(3)最后统计对应每个N值的三元组数量,即可解题。

但是这样x和d无法枚举,继续:

由上面得(x+2d)^2-(x+d)^2-x^2=-x^2+2dx+3d^2=(3d-x)(x+d)=N;

另设p=3d-x ;   q=x+d; 那么得:p*q=N  ;   d=(p+q)/4; x=(3q-p)/4;

(注:上面在给a = 1,b = 30例子时没有给{0,3,6}与{12,9,6}这对,说明x的起始值应大于0)

所以得出下面四个限制条件:

1) p+q能被4整除;

2) 3q-p大于等于4;(条件1、2能推出3q-p能被4整除:因为3q-p+p+q=4p)

3) a=<p*q<=b

4)p,q是正整数

由上面4个限制条件我们可以通过枚举p、q来计算出相应的N值,将相应的统计量+1;

你是否会想当不同的p、q计算相同N值的时候是否会是同一个三元组?那么我们假设存在这种情况,那么:

x1=(3*q1-p1)/4  ==  x2=(3*q2-p2)/4 ;

d1=(p1+q1)/4    ==  d2=(p2+q2)/4 ;

解得p1==p2; q1==q2

所以说明只有当p、q两个值都相同时才对应同一个三元组,所以通过枚举p、q,利用上面的4个限制条件解题,转换为C++代码为:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <iostream>  
  3. #include <string>  
  4. using namespace std;  
  5. class Test {  
  6. public:  
  7.     static long Count (int   a,int   b){  
  8.         int res=0;  
  9.         int *resA=new int[b-a+1];  
  10.         for(int i=0;i<=b-a;++i)  
  11.             resA[i]=0;  
  12.         for(int p=1;p<=b;++p){  
  13.             int start=p/4+1;          
  14.             int q=4*start-p;  
  15.             int p3=p/3+2;  
  16.             while(q<=b){  
  17.                 int tmp=p*q;  
  18.                 if(tmp>b)break;  
  19.                 if(q>=p3){  
  20.                     if(tmp>=a)  
  21.                         ++resA[tmp-a];  
  22.                 }  
  23.                 q+=4;  
  24.             }  
  25.         }  
  26.         for(int i=0;i<=b-a;++i)  
  27.             res+=resA[i]*(resA[i]-1);  
  28.         res/=2;  
  29.         return res;  
  30.     }  
  31.   
  32. };  
  33. //start 提示:自动阅卷起始唯一标识,请勿删除或增加。  
  34. int main()  
  35. {     
  36.     cout<<Test::Count(1,30)<<endl;    
  37.     return 0;  
  38. }   
  39. //end //提示:自动阅卷结束唯一标识,请勿删除或增加。  

显然复杂度为sum (1/4*b/i),i=1....b,根据调和级数得,O(blogb)

目录
相关文章
|
存储 算法
算法题:4209三元组
**这次周赛只能做出来一道,,,还是太菜 第一道:** 给定 n 个整数三元组 (xi,yi,zi)。 请你判断这些整数三元组是否能够同时满足以下三个条件: 所有 xi 相加之和为 0。 所有 yi 相加之和为 0。
94 0
|
存储 算法
经典算法题每日演练——第二十题 三元组
原文:经典算法题每日演练——第二十题 三元组          我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用,当然矩阵有着不足的地方就是空间和时间 复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory。
1097 0
|
22天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
22天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
1月前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
23天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
25天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
|
25天前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
7天前
|
算法
基于ACO蚁群优化的UAV最优巡检路线规划算法matlab仿真
该程序基于蚁群优化算法(ACO)为无人机(UAV)规划最优巡检路线,将无人机视作“蚂蚁”,巡检点作为“食物源”,目标是最小化总距离、能耗或时间。使用MATLAB 2022a版本实现,通过迭代更新信息素浓度来优化路径。算法包括初始化信息素矩阵、蚂蚁移动与信息素更新,并在满足终止条件前不断迭代,最终输出最短路径及其长度。