(ディビジョン2の定格)教育Codeforcesラウンド81 - D.同じGCDs - 欧州の+を拡大オイラー機能

タイトルリンクします。https://codeforces.com/contest/1295/problem/D
タイトル効果:
様々な実施形態では
、あなたに、AとMを与えます。頼む何X(0 <= X <M )ようにGCD(M)= GCD (+ X、M)。
ここに画像を挿入説明
アイデア:拡張欧州定理:
GCD(A + X、M)= GCD((A + X)%M、M)
、Mの値(A + X)%は、[0、M-1]であってもよいです。
GCD(A + X、M)= GCD(A、M)
1:もしGCD(M)= 1 。所望のGCD(X、M)= 1である (0 <= X <M)X = 0 満たしません。Mはオイラー関数です。
2 :!場合GCD = GCD(M) = 1。それは所望のGCDである(X / GCD、M / GCD)= 1(0 / GCD <= X / GCD <M / GCD)X = 0 / GCDが満たさ。これはオイラー関数M / GCDです。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
 
LL euler(LL n)
{
    LL res=n;
    for(LL i=2;i*i<=n;i++)
    {
        if(n%i==0)//第一次找到的必为素因子
            res=res/i*(i-1);
        while(n%i==0)//把该素因子全部约掉
            n/=i;
    }
    if(n>1)
        res=res/n*(n-1);
 
    return res;
}
 
int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        LL a, m;
        scanf("%lld%lld", &a, &m);
        if(__gcd(a,m)==1){
            printf("%lld\n", euler(m));
        }
        else{
            printf("%lld\n", euler(m/__gcd(a, m)));
        }
    }
    return 0;
}
公開された384元の記事 ウォン称賛22 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_21433411/article/details/104114517