CF1295D Same GCDs
题目链接:CF1295D Same GCDs
本文版权归博客园和蒟蒻wjr所有,欢迎转载,但需保留此段声明,并给出原文链接,如有侵权行为,还请不吝啬向博主举报,谢谢合作。
给定,求出有多少个满足且
表示和的最大公因数
数论题
考虑设
肯定满足
结论1:
证明:
假设
即
此时
即
互相矛盾
综上所述:成立
结论2:
答案是
显然对与任意与m互质的数和任意正整数
满足:
显然与互质
对于当,答案是的与互质的个数
对于与,答案是的与互质的个数
两个答案区间合并即是
欧拉函数:
其中为的所有质因数,是不为的整数。(唯一和互质的数就是本身)。
因为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;
}
欧拉函数复杂度
算法总复杂度
#include<cstdio>
#define re register
#define ll long long
using namespace std;
template<typename T>
inline void read(T&x)
{
x=0;
char s=(char)getchar();
bool flag=false;
while(!(s>='0'&&s<='9'))
{
if(s=='-')
flag=true;
s=(char)getchar();
}
while(s>='0'&&s<='9')
{
x=(x<<1)+(x<<3)+s-'0';
s=(char)getchar();
}
if(flag)
x=(~x)+1;
return;
}
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()
{
read(T);
while(T--)
{
ll a,m;
read(a),read(m);
printf("%lld\n",Eular(m/gcd(a,m)));
}
return 0;
}
作者:蒟蒻wjr
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?