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)

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

传送门:Infinite Fence
题意:判断 ( r < b ) p b   ( p 1 ) b (r<b) p*b~(p-1)*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) 的所有因子是a,b的所有公约数.

将a,b分解质因子,g=gcd(a,b),质因子的指数 p g = m i n ( p a , p b ) p_g=min(p_a,p_b) ,所以这些公共质因子组成了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 号牌子涂成白色,其他为黑色,假设有1-无穷个牌子,黑色牌子是否无穷
题解: x a + y b = k g c d ( a , b ) x*a+y*b=k*gcd(a,b) 若有有限个黑色牌子,在某一位置开始后 k g , k g + 1 , k g + 2...... k*g,k*g+1,k*g+2... ... 都是白色, x a + y b x*a+y*b 连续需 g c d ( a , b ) = 1 , k g c d ( a , b ) gcd(a,b)=1,k*gcd(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;
}
发布了96 篇原创文章 · 获赞 11 · 访问量 2276

猜你喜欢

转载自blog.csdn.net/weixin_43769146/article/details/103392737
gcd