D. Same GCDs

原题链接

题解

gcd(a+x,m)=gcd((a+x)mod m,m)
由于 x[0,m1],所以 (a+x)mod m 一定能遍历完 [0,m1] 里的所有数
所以 gcd(a+x,m) 等价于 gcd(x,m)
接下来,令 d=gcd(a,m),则有 m=t1dx=t2d,其中 t1t2 互质(如果不互质,代表其还有公因子没有给到 d
所以等价于求有多少 t,使得 tmd 互质,且 t·d<m,也就是求 φ(md)

如何求 φ(md)

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

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

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

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

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

接着,对于任意正整数 n,其质因子分解为 n=p1a1·p2a2·...·pkakp 为质数
所以 φ(n)=φ(p1a1)·φ(p2a2)·...·φ(pkak)
而对于 pa,有 φ(pa)=papa1=pa(11p)

为什么

由于 p 是质数,所以 [1,pa] 里,不与其互质的数只有
1p,2p,3p...pa1p
总共 pa1

所以 φ(n)=p1a1(11p1)p2a2(11p2)...pkak(11pk)

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 @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示