CF1295D Same GCDs
作者:互联网
题目链接:CF1295D Same GCDs
\[description\]
给定\(a,m\),求出有多少个\(x\)满足\(0\leq x<m\)且
\[gcd(a,m)=gcd(a+x,m)\]
\(gcd(x,y)\)表示\(x\)和\(y\)的最大公因数
\[solution\]
数论题
考虑设\(d=gcd(a,m)\)
肯定满足\(d|a,d|m,d|(a+x)\)
\(\therefore d|x\)
结论1:
\[gcd(\frac{a+x}{d},\frac{m}{d})=1\]
证明:
假设\(gcd(\frac{a+x}{d},\frac{m}{d})\neq 1\)
即\(gcd(\frac{a+x}{d},\frac{m}{d})> 1\)
此时
\[gcd(a+x,m)=gcd(\frac{a+x}{d}\times d,\frac{m}{d}\times d)>d\]
即\(gcd(a+x,m)\neq gcd(a,m)\)
互相矛盾
综上所述:\(gcd(\frac{a+x}{d},\frac{m}{d})=1\)成立
结论2:
答案是
\[\varphi(\frac{m}{d})\]
显然对与任意与m互质的数\(p\)和任意正整数\(k\)
满足:
\[gcd(p+\frac {km}{d},\frac{m}{d})=gcd((p+k\frac{m}{d})\ mod\ \frac{m}{d},\frac{m}{d})=gcd(p,\frac{m}{d})=1\]
显然\(p+\frac {km}{d}\)与\(\frac{m}{d}\)互质
对于当\(a+x\leq m\),答案是\(\frac{a}{d}\leq x\leq \frac{m}{d}\)的与\(\frac{m}{d}\)互质的个数
对于与\(m<a+x<a+m\),答案是\(x<\frac{a}{d}\)的与\(\frac{m}{d}\)互质的个数
两个答案区间合并即是\(\varphi(\frac{m}{d})\)
欧拉函数:
其中\(p_1, p_2……p_k\)为\(n\)的所有质因数,\(n\)是不为\(0\)的整数。\(\varphi(1)=1\)(唯一和\(1\)互质的数就是\(1\)本身)。
\[\varphi(n)=n\prod _ {i=1}^{k}(1-\frac{1}{p_i})\]
因为n最多有一个大于\(\sqrt{n}\)的质因数
所以可以得到以下代码
inline long long Eular(long long n)
{
long long ans=n;
for(re int i=2; 1ll*i*i<= n; i++)
{
if(n%i==0)
{
ans-=ans/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
ans-=ans/n;
return ans;
}
欧拉函数复杂度\(O(\sqrt n)\)
算法总复杂度\(O(T\sqrt n)\)
\[code\]
#include<cstdio>
#define re register
#define ll long long
using namespace std;
inline ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
inline long long Eular(long long n)
{
long long ans=n;
for(re int i=2; 1ll*i*i<= n; i++)
{
if(n%i==0)
{
ans-=ans/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
ans-=ans/n;
return ans;
}
int T;
int main()
{
scanf("%d",&T);
while(T--)
{
ll a,m;
scanf("%lld%lld",&a,&m);
ll gcdd=gcd(a,m);
m/=gcdd;
// printf("%d\n",gcdd);
printf("%lld\n",Eular(m));
}
return 0;
}
标签:frac,gcd,ll,long,Same,ans,CF1295D,互质,GCDs 来源: https://www.cnblogs.com/wangjunrui/p/12242400.html