[数论]HDU 2504 又见GCD

来源:互联网 发布:maven build java 编辑:程序博客网 时间:2024/06/01 23:01

题意:

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+3int 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);    }}


原创粉丝点击