B-Doremy's Perfect Math Class
思路:假設答案集合,在普遍的答案集合中找到特別之處.
!!假設!!a1,a2,a3,a4就是某個集合S的答案。
a2-a1=a1,即a2=2*a1.
必然的..因為a2-a1<a2,結果又存在於S中,結果只能是a1.
a3-a2=a1 or a2 ?
假如a3-a2=a2,則a3=2*a2=4*a1.那麼a3-a1=3*a1..又3*a1>a2, 3*a1<a3..意味著a2,a3之間還有不存在的數。這是和一開始的假設矛盾的
所以a3-a2=a1,才是合法的.
a4-a3=a1 or a2 or a3 ?
if--a4-a3=a3,則a4=2*a3=6*a1.那麼a4-a1=5*a1..又5*a1>a3, 5*a1<a4..意味著a3,a4之間還有不存在的數。這是和一開始的假設矛盾的
if--a4-a3=a2,則a4=5*a1.那麼a4-a1=4*a1..又4*a1>a3,4*a1<a4..還是意味著a3,a4,之間還有不存在的數字。這是和一開始的假設矛盾的
那麼a4-a3=a1.才是合法的。那麼可以發現兩個相鄰的數字的差值是一定的,是最小的數字a1..意味著答案是一個等差數列
因為是一個等差數列,設公差為d,那麼d=a1,且更大的數必然都是a1的倍數.所以答案即是maxn/a1; 但是a1不一定是輸入的最小值.
如果單純記錄陣列之間的最小差值,或集合本身最小值是不行的:{3,5,7,9}-->{1,2,3,4,5,6,7,8,9}; 5-3=2,3-2=1輾轉相減,出現了1.----在求gcd的時候,5%3=2,3%2=1--->5-3-2=1;
9%5=4,5%4=1--->9-5-4=1;
{5,25}-->{5,10,15,20,25}
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
void solve(){ //補B--數學思維
//偏門:觀察樣例
//cout<<__gcd(24,12);
int n,_gcd=0; cin>>n;
int maxn=INT_MIN;
for(int i=1;i<=n;i++){
int x; cin>>x;
maxn=max(maxn,x);
_gcd=gcd(_gcd,x);
}
cout<<maxn/_gcd<<endl;
}