六、A Balanced Problemset?
(1)证明所有子问题的最大公因数一定是x的因数
引入约数性质: a ∣ b , a ∣ c → a ∣ ( k b + l c ) a|b,a|c\rightarrow a|(kb+lc) a∣b,a∣c→a∣(kb+lc)
扩展到n个数同样: a ∣ b , a ∣ c , a ∣ d , … … , a ∣ n → a ∣ ( k b + l c + … … + p d ) = a ∣ x a|b,a|c,a|d,……,a|n\rightarrow a|(kb+lc+……+pd)=a|x a∣b,a∣c,a∣d,……,a∣n→a∣(kb+lc+……+pd)=a∣x
所以所有子问题的最大公因数一定是x的因数
(2)证明枚举的因数 d d d一定是可能的最大公因数
即证明组成 x x x的一定是因数以及他的倍数
因为 d d d是 x x x的因数,所以 x x x一定是 d d d的倍数,所以 x x x一定由 d d d和其倍数组成,不可能有非倍数的情况。
#include<iostream>
#include<algorithm>
using namespace std;
//证明子问题的最大公因数一定是x的因数
//证明每一次枚举的可能的最大公因数,一定是成立的。
typedef long long ll;
int main(){
int t; cin>>t;
while(t--){
ll x,n; cin>>x>>n;
ll g=-1;
for(ll i=1;i*i<=x;i++){
if(x%i==0){
ll j=x/i;
if(n*i<=x) g=max(g,i);
if(n*j<=x) g=max(g,j);
}
}
cout<<g<<endl;
}
}