uva 11889

来源:互联网 发布:万能视频下载 mac 编辑:程序博客网 时间:2024/04/29 11:56

给出a,c 求出最小的b .

利用质因数分解的思想拆开a和c的因子,然后凑出b

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <algorithm>using namespace std;typedef long long ll;const int maxn=1e4+5;int prime[maxn],len=0;bool vis[maxn];void pri(){    for(int i=2; i<maxn; i++)    {        if(!vis[i]) prime[len++]=i;        for(int j=0; j<len&&i*prime[j]<maxn; j++)        {            vis[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}int main(){    pri();    int t;    scanf("%d",&t);    while(t--)    {        int a,c;        scanf("%d%d",&a,&c);        if(c%a) printf("NO SOLUTION\n");        else        {            int en=sqrt(a+0.5),ans=1;            for(int i=0; i<len&&prime[i]<=en; i++)            {                int cou1=0,cou2=0;                while(c%prime[i]==0)                {                    c/=prime[i];                    ans*=prime[i];                    cou1++;                }                while(a%prime[i]==0)                {                    a/=prime[i];                    cou2++;                }                if(cou2==cou1)                {                    while(cou2--)                    {                        ans/=prime[i];                    }                }            }            int cou1=0;            if(a>1) while(c%a==0)                {                    cou1++;                    c/=a;                    ans*=a;                }            if(cou1==1) ans/=a;            ans*=c;            printf("%d\n",ans);        }    }    return 0;}


a=p1^e1*p2^e2...

b=p1^k1*p2^k2..

假设e1>k1,k2>e2.

c=p1^(max(e1,k1))*p2^(max(k2,e2))...

c/a=p1^(e1-k1)  *   p2^(k2-e2)

e1>k1 那么b中就的k1取0. 因为对lcm无影响同时做到最小.

k2-e2  我们要求出b就要+回一个e2.但是 可能 k2-e2<e2 ,g=gcd(c/a,a)=p2^(k2-e2).    c/a*g<b;

所以我们不能一步到位求出b。这个时候我们可以减小a中p2的次幂,加到b中。直到两个数互质

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <algorithm>using namespace std;typedef long long ll;int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int a,c;        scanf("%d%d",&a,&c);        if(c%a) printf("NO SOLUTION\n");        else        {            int ans=c/a,g=gcd(a,ans);            while(g!=1)            {                ans*=g;                a/=g;                g=gcd(ans,a);            }            printf("%d\n",ans);        }    }}



0 0
原创粉丝点击