您的位置:首页 > 其它

[数论]HDU 2504 又见GCD

2017-07-07 11:25 330 查看
题意:

a,c的最大公约数是b,那么a/b和c/b互质。

假设a/b为k,找与k互质的最小数。这个数明显不必要是个合数,因为一个合数和k互质,那么它的所有质因子也和k互质,且它的质因子小于它本身,更符合条件。

所以在范围内把质数筛出来,针对每个样例找个满足条件的最小的就可以了。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
#pragma comment(linker, "/STACK:10240000000,10240000000")
#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define bug puts("===========");
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define ALL(A) A.begin(), A.end()
#define T_T for(int _=RD(),test=1;test<=_;test++)
typedef long long ll;
typedef pair<ll ,ll> pii;
#define CHG ch=getchar()
#define FRD x=bo=0; for(CHG;ch<'0'||ch>'9';CHG) if(ch=='-')bo=1;
#define FR2 for(;ch>='0'&&ch<='9';x=(x<<1)+(x<<3)+ch-'0',CHG);
char ch; int bo;
inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}
inline void RD(int &x){ FRD FR2 if (bo)x=-x; }
inline void RD(ll &x){ FRD FR2 if (bo)x=-x; }
inline ll RD(){ ll x; RD(x); return x; }
inline void RD(char *s){///scanf %s
for (CHG;blank(ch);CHG);
for (;!blank(ch);CHG)*s++=ch; *s=0;
}
inline void RD(char &c){for(CHG;blank(c);CHG);}
template<class T> inline void OT(T x){
static char buf[20];
char *p1=buf;if (!x)*p1++='0';if (x<0)putchar('-'),x=-x;
while(x)*p1++=x%10+'0',x/=10;
while(p1--!=buf)putchar(*p1);
}
inline void pe(){puts("");}//输出回车
inline void pk(){putchar(' ');}//输出空格
const double eps=1e-8;
const int inf=1e7;
const int maxn=1e5+70;
const ll mod =100000007;
#define mytype int
#define pii pair<int,int>
/*======================================*/
#define mx 1000000+3
int ispr[mx],pr[mx];
int cnt;
void getprime()
{
cnt=0;
memset(ispr,0,sizeof(ispr));
for(int i=2;i<mx;i++)
{
if(ispr[i]==0)pr[cnt++]=i;
for(int k=0;k<cnt&&i*pr[k]<mx;k++)
{
ispr[pr[k]*i]=1;
if(!(i%pr[k]))break;
}
}
}
int main()
{
getprime();
T_T{
int a,b;
scanf("%d%d",&a,&b);
int k=a/b;
int ans;
REP(i,cnt)if(k%pr[i]!=0){
ans=pr[i];
break;
}
printf("%d\n",ans*b);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论