题目链接:小数论
题目的意思很简单,gcd(a,c)=b,c!=b,给出a,b,求最小的c。(0<a,b,c<10^6)。
根据gcd的性质,我们可以知道,k1*b=a,k2*b=c,那么k1和k2一定是互素的。
题目中给出了,a和b,那么我们是可以求出k1的。对吧?
那么,我们现在的任务变成了,求一个最小的k2(2--k1)和k1互素的数。(这个数一定存在,为什么?这是显然的。)
我看到,有很多的人的错误想法是c一定为2*b。
这种想法很显然是错误的,为什么?
c=2*b也就是说,k2=2,当a=4*b的时候,k1=4,gcd(a,c)=2*b,gcd(a,c)=b显然是不正确的。
所以说,这种说法是错误的。
代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL __int64
using namespace std;
LL gcd(LL a,LL b){
if(b==0) return a;
return gcd(b,a%b);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
LL a,b;
scanf("%I64d%I64d",&a,&b);
LL x=a/b;
for(LL i=2;i<=x;i++){
if(gcd(x,i)==1){
printf("%I64d\n",i*b);
break;
}
}
}
return 0;
}
小小数论,有很多的知识,继续搞数论!