D. Same GCDs

原题链接

题解

\(\gcd(a+x,m) = \gcd((a+x)mod\ m,m)\)
由于 \(x\in[0,m-1]\),所以 \((a+x)mod\ m\) 一定能遍历完 \([0,m-1]\) 里的所有数
所以 \(\gcd(a+x,m)\) 等价于 \(\gcd(x,m)\)
接下来,令 \(d=\gcd(a,m)\),则有 \(m=t_1d\)\(x=t_2d\),其中 \(t_1\)\(t_2\) 互质(如果不互质,代表其还有公因子没有给到 \(d\)
所以等价于求有多少 \(t\),使得 \(t\)\(\frac{m}{d}\) 互质,且 \(t·d \lt m\),也就是求 \(\varphi(\frac{m}{d})\)

如何求 \(\varphi(\frac{m}{d})\)

首先,如果 \(n\)\(m\) 互质,则 \(\varphi(nm)=\varphi(n)·\varphi(m)\)

为什么 画一个 $n$ x $m$ 的表格,行坐标为 $[0,m-1]$,纵坐标为 $[1,n]$,则表格上每个点表示的数为 $x_in+y_i$

则有 \(\varphi(n)\) 个行的元素与 \(n\) 互质

同理,有 \(\varphi(m)\) 个列的元素与 \(m\) 互质

而与 \(nm\) 互质,当且仅当与 \(n\)\(m\) 均互质
所以 \(\varphi(nm)=\varphi(n)·\varphi(m)\)

接着,对于任意正整数 \(n\),其质因子分解为 \(n=p_1^{a_1}·p_2^{a_2}·...·p_k^{a_k}\)\(p\) 为质数
所以 \(\varphi(n)=\varphi(p_1^{a_1})·\varphi(p_2^{a_2})·...·\varphi(p_k^{a_k})\)
而对于 \(p^a\),有 \(\varphi(p^a)=p^a-p^{a-1}=p^a(1-\frac{1}{p})\)

为什么

由于 \(p\) 是质数,所以 \([1,p^a]\) 里,不与其互质的数只有
\(1p,2p,3p...p^{a-1}p\)
总共 \(p^{a-1}\)

所以 \(\varphi(n)=p_1^{a^1}(1-\frac{1}{p_1})p_2^{a^2}(1-\frac{1}{p_2})...p_k^{a_k}(1-\frac{1}{p_k})\)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll phi(ll x)
{
    ll ans=x;
    for(ll i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            ans=ans/i*(i-1);
            while(x%i==0) x/=i;
        }
    }

    if(x>1)
    {
        ans=ans/x*(x-1);
    }
    return ans;
}

ll solve()
{
    ll a,m;
    cin>>a>>m;

    int d=__gcd(a,m);
    return phi(m/d);
}
int main()
{
    int t;
    cin>>t;

    while(t--) cout<<solve()<<'\n';
    return 0;
}

posted @ 2024-07-10 14:24  纯粹的  阅读(24)  评论(0)    收藏  举报