化简
题目描述
分析
该题是访问Q次,并每次访问的数的分母一定小于输入数据n且输入的数需小于1大于0,并保证他是最分数,因此分数的分子与分母的·1最大公约数一定为1,因此我们对于每次访问,仅需循环1到qi,并对1到qi的数判断它与qi是否存在大于1的最大公约数。而求最大公约数可使用欧几里得算法(gcd算法)
gcd算法
首先我们设 a与b两数字,同时因为两数一定存在一个最大公约数,因此设a=k1×c,b=k2×c; 而此时a mod b 得出余数r等价于 r=a-p×b;
因此 r=k1×c-p×k2×c 因此 r=(k1-k2×p)c;故此时r为c的倍数所以我们仅需求出r%c取余为0时 就可得到c
因此我们仅需先求出r(a%b),r是c的倍数,b也是c的倍数,此时以b为a,r为b重复步骤,可以不断减小r的数值(注意此时r仍然是c的倍数),直到r等于c,并此时b也为c的倍数故b%r==0;此时返回r;
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
return b ? gcd(b, a%b) : a;//如果b不为0则继续递归gcd如果为0则返回a;
}
int main()
{
int N,Q;
cin>>N>>Q;
while(Q--)
{
int num=0,k;
cin>>k;
for(int i=1;i<k;i++)
if(gcd(i,k)==1)num++;
cout<<num<<endl;
}
return 0;
}