gcd应用

g c d ( a , b ) = m i n ( q a − p b ) ( q a ! = p b ) gcd(a,b)=min(qa-pb) (qa!=pb) gcd(a,b)=min(qapb)(qa!=pb)

可用欧几里得扩展证明, q ∗ a − p ∗ b = g q*a-p*b=g qapb=g,若有整数解则 g = k ∗ g c d ( a , b ) , m i n ( g ) 时 k = 1 g=k*gcd(a,b),min(g)时 k=1 g=kgcd(a,b),min(g)k=1

传送门:Infinite Fence
题意:判断 ( r < b ) p ∗ b   ( p − 1 ) ∗ b (r<b) p*b~(p-1)*b (r<b)pb (p1)b之间 r的倍数是否少于k

#include<bits/stdc++.h>
using namespace std;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int r,b,k;
        scanf("%d%d%d",&r,&b,&k);
        int t=__gcd(r,b);
        if((max(r,b)-t-1)/min(r,b)+1<k) cout<<"OBEY"<<endl;
        else cout<<"REBEL"<<endl;
    }
    return 0;
}


g c d ( a , b ) gcd(a,b) gcd(a,b)的所有因子是a,b的所有公约数.

将a,b分解质因子,g=gcd(a,b),质因子的指数 p g = m i n ( p a , p b ) p_g=min(p_a,p_b) pg=min(pa,pb),所以这些公共质因子组成了g,他们所有的公约数都是有这些质因子组成的,所以直接求g的因子。
传送门:约数
题意:求a,b的全部公约数

#include<bits/stdc++.h>
using namespace std;
set<long long> st;
int main(){
    long long a,b;
    scanf("%lld%lld",&a,&b);
    long long Gcd=__gcd(a,b);
    long long t=sqrt(Gcd);
    for(int i=1;i<=t;++i){
        if(Gcd%i==0){
            st.insert(i);
            if(Gcd/i!=i) st.insert(Gcd/i);
        }
    }
    set<long long > ::iterator it=st.begin();
    for(;it!=st.end();++it){
        cout<<*it<<" ";
    }
    return 0;
}


传送门:A. Good ol’ Numbers Coloring

题意:可以把 x ∗ a + y ∗ b x*a+y*b xa+yb号牌子涂成白色,其他为黑色,假设有1-无穷个牌子,黑色牌子是否无穷
题解: x ∗ a + y ∗ b = k ∗ g c d ( a , b ) x*a+y*b=k*gcd(a,b) xa+yb=kgcd(a,b)若有有限个黑色牌子,在某一位置开始后 k ∗ g , k ∗ g + 1 , k ∗ g + 2...... k*g,k*g+1,k*g+2... ... kg,kg+1,kg+2......都是白色, x ∗ a + y ∗ b x*a+y*b xa+yb连续需 g c d ( a , b ) = 1 , k ∗ g c d ( a , b ) gcd(a,b)=1,k*gcd(a,b) gcd(a,b)=1,kgcd(a,b)才能连续

#include<bits/stdc++.h>
using namespace std;
set<int> s;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int a,b;
        s.clear();
        scanf("%d%d",&a,&b);
        if(__gcd(a,b)==1){
            cout<<"Finite"<<endl;
        }
        else cout<<"Infinite"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值