1593D1 - All are Same(数学规律+数论+入门级)
1593D1 - All are Same(源地址自⇔CF1593D1)
Problem
Example
3
6
1 5 3 1 1 5
8
-1 0 1 -1 0 1 -1 0
4
100 -1000 -1000 -1000
2
1
1100
tag:
⇔数学规律、⇔数论、⇔入门级(*1100)
题意:
对于一串数字,找到最大的 \(k\) ,使得每一位数字减去若干个 \(k\) 后变成一样。
思路:
找到这串数字中最小的那个,然后计算所有数字与最小数字的差的最大公因数。
简易证明:假设 \(a<b<c\) ,将 \(b\) 和 \(c\) 变成 \(a\) 分别需要减去 \(k_b\) 和 \(k_c\) ,则答案即为 \(gcd(k_b,k_c)\) 。
AC代码:
//A WIDA Project
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
int T,n,k,ans,a[MAX];
//===============================================================
int main(){
cin>>T;
while(T-->0){
k=MAX9;ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
k=min(k,a[i]);
}
for(int i=1;i<=n;i++){
ans=__gcd(ans,a[i]-k);
}
if(ans==0) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
错误次数:1次
原因:未判断 \(-1\) 的情况(即 \(k\) 可以取任何值的情况)。
文 / WIDA
2021.10.15成文
首发于WIDA个人博客,仅供学习讨论
更新日记:
2021.10.15 成文