Lunatic Never Content

该问题是一个算法题,目标是找到一个最大的正整数x,使得数组a对x取模后的结果为回文数组。这需要通过计算每对数的差值的最大公约数来逐步缩小x的范围。代码示例中使用了C++,通过__gcd函数求最大公约数,并遍历数组的一半来确定x。
摘要由CSDN通过智能技术生成

题目:

 

  

题意解析:

现在有一个数组 a,和 n 个非负整数,定义 f(a,x)=[a1​modx,a2​modx,…,an​modx],其中 x 为正整数。现要你找到最大的 x,使得 f(a,x) 是回文的。

这里,amodx 的含义为 a 除以 x 得到的余数。

我们认为一个数组是回文的,当且仅当从前往后读得到的结果和从后往前读得到的结果完全相同。换句话说,一个长度为 n 的数组 a 是回文的,当且仅当 ∀1≤i≤n,有 ai​=an−i+1​。

题解:

(1)这个题目就是要不断缩小ans,但是缩小ans,不是随便缩小的,要不断取ans和a[i]-a[n-i+1]的差值的最大公约数。

(2)为什么要取最大公约数,因为要满足每一对数的差值,每一对数的差值必须能把这个数整除。才能保证数组最后是回文的。

代码:

#include<bits/stdc++.h>
using namespace std;
int t,n,k;
int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		long long int a[n+10];
		for(int i=1; i<=n; i++) {
			cin>>a[i];
		}
		long long int ans=llabs(a[1]-a[n]);
		for(int i=2;i<=n/2;i++){
			ans=__gcd(ans,llabs(a[i]-a[n-i+1]));	
		}
		cout<<ans<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值