题解
\(\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;
}
标签:frac,GCDs,ll,varphi,Same,ans,互质,gcd
From: https://www.cnblogs.com/pure4knowledge/p/18293991