1. 程式人生 > 其它 >1593D1 - All are Same(數學規律+數論+入門級)

1593D1 - All are Same(數學規律+數論+入門級)

2021.10.15補題

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 成文