蓝桥杯每日一题:最大公约数(欧拉函数)

给定两个正整数 a,m,其中 a<m。

请你计算,有多少个小于 m 的非负整数 x 满足:

gcd(a,m)=gcd(a+x,m)

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含两个整数 a,m。

输出格式

每组数据输出一行结果,一个整数,表示满足条件的非负整数 x 的个数。

数据范围

前三个测试点满足,1≤T≤10。

所有测试点满足,1≤T≤50,1≤a<m≤1010。

输入样例:
复制代码
3
4 9
5 10
42 9999999967
输出样例:
复制代码
6
1
9999999966

解题思路:

gcd(a,m)== gcd(a+x,m) = d;

由于d为最大公约数所哟 a /= d,x/=d,m/=d后: a+x 与m互质(且x<m)可以转换为a~a+m-1中与m互质的个数。用数轴表述:

(m~a+m-1) % m == (0~a-1) % m;

问题转换为0-m-1中与m互质的个数,又因为0,m-1都与m不互质所以相当于去m的欧拉函数。

欧拉函数:

参考代码:

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;
LL T,a,m;

LL gcd(LL a,LL b)
{
    return b ? gcd(b,a % b) : a;
}

LL ula(LL n)
{
    LL ans = n;
    for(int i=2;i<=n/i;i++)
        if(n%i==0)
        {
            ans = ans / i * (i-1);
            while(n%i==0) n/=i;
        }
        
    if(n>1) ans = ans / n * (n-1);
    return ans;
}

int main()
{
    cin>>T;
    while(T -- )
    {
        cin>>a>>m;
        
        m /= gcd(a,m);
        
        cout<<ula(m)<<endl;    
    }
    return 0;
}
相关推荐
m0_7381207213 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php
一个儒雅随和的男子13 小时前
限流算法详细剖析
java·服务器·算法
AC赳赳老秦13 小时前
用 OpenClaw 制定技术学习计划:根据目标岗位自动生成学习路线、推荐学习资源
开发语言·c++·人工智能·python·mysql·php·openclaw
ShineWinsu14 小时前
对于Linux:内核是如何组织管理IPC资源的解析
linux·服务器·c++·面试·笔试·线程·ipc
少司府14 小时前
C++进阶:红黑树
开发语言·数据结构·c++·b树·二叉树·红黑树
工业胶粘剂技术14 小时前
单组分高温环氧结构胶 K-EP280 完整技术参数与工程选型分析
算法·制造
汉克老师14 小时前
GESP6级C++考试语法知识(五十五、动态规划----背包问题(八、混合背包)
c++·动态规划·dp·背包问题·gesp六级·混合背包问题
特种加菲猫14 小时前
哈希表的实现
开发语言·c++
玖釉-14 小时前
nvpro_core2 详解:NVIDIA Vulkan / OpenGL 图形样例背后的现代 C++ 基础库
c++·windows·图形渲染
不会C语言的男孩14 小时前
C++ Primer 第19章:特殊工具与技术
数据结构·c++