A Balanced Problemset? 题解

六、A Balanced Problemset?

A Balanced Problemset?

(1)证明所有子问题的最大公因数一定是x的因数

引入约数性质: a ∣ b , a ∣ c → a ∣ ( k b + l c ) a|b,a|c\rightarrow a|(kb+lc) ab,aca(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 ab,ac,ad……ana(kb+lc+……+pd)=ax

所以所有子问题的最大公因数一定是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;
    }
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值