zoukankan      html  css  js  c++  java
  • soj1200- 简单的等式 (素数打表,找因子)

    1200: 简单的等式

    Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 35  Solved: 4 [Submit][Status][Web Board]

    Description

    我们知道等式很很多种,有一些等式很复杂,我们无法求解。

    今天,我们解决一个简单的等式:a*x+b*y=x*y; 其中a,b,x,y都是正整数。

    告诉和a,b的值和一个m,你的任务是求出一对(x,y)的解,其中,要求 x>=m;

    如果有多组解,输出(x+y)最小的一个,如果还有多组解,输出x最小的一组。

    Input

    多组测试数据;

    每组包含a,b,m三个整数(其中1=<a<=b;并且满足a*b<10^10;2*b=<m<10^9).

    Output

    输出x和y;如果无满足条件的解,输出"No answer";

    对于大数,请用long long而非__int64;(long long大小为10^18次方左右)

    输入输出大数使用(sacnf("%lld",&n)和printf("%lld",n); 或者cin,cout)

    Sample Input

    1 1 2
    1 1 3
    3 4 8
    3 4 9
    

    Sample Output

    2 2
    No answer
    8 6
    10 5
    

    ------------------------------------
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    long long MAX=11000000000;
    bool isprime[1000010];
    long long prime[100000],tpr;
    long long factor[1000010],tfa;
    void getprime()
    {
        long long i,j;
        tpr=0;
        memset(isprime,1,sizeof(isprime));
        for (i=2;i<=1000010;i++)
        {
            if (isprime[i]) prime[++tpr]=i;
            for (j=1;j<=tpr&&prime[j]*i<=1000000;j++)
            {
                isprime[prime[j]*i]=0;
                if (i%prime[j]==0) break;
            }
        }
    }
    void getfactor(long long x)
    {
       // cout<<x<<endl;
        long long i,j;
        long long t=1,xx;
        tfa=0;
        factor[tfa++]=1;
        for (i=1;i<tpr;i++)
        {
            if (prime[i]*prime[i]>x) break;
            if (x%prime[i]) continue;
            xx=prime[i];t=tfa;
            while (x%prime[i]==0)
            {
                for (j=0;j<t;j++) factor[tfa++]=xx*factor[j];
                xx*=prime[i];
                x/=prime[i];
              //  cout<<t<<" "<<x<<" "<<xx<<" "<<endl;
            }
            t=tfa;
        }
        if (x!=1)
        {
            for (i=0;i<t;i++) factor[tfa++]=factor[i]*x;
        }
    }
    int main()
    {
        long long i;
        long long a,b,m,x,y,ab,dx,dy;
        getprime();
        while (~scanf("%lld%lld%lld",&a,&b,&m))
        {
          //  cout<<a<<" "<<b<<" "<<a*b<<endl;
            getfactor(a*b);
          // cout<<tfa<<endl;
          //  for (i=0;i<tfa;i++) cout<<factor[i]<<" ";cout<<endl;
          //  sort(factor,factor+tfa);
          //  cout<<tfa<<endl;
          //  for (i=0;i<tfa;i++) cout<<factor[i]<<" ";cout<<endl;
            x=0;ab=a*b;dx=MAX;dy=MAX;
            for (i=0;i<tfa;i++)
             {
                if (factor[i]>=m-b)
                    {
                        x=factor[i]+b;
                        y=a+ab/factor[i];
                      //  cout<<x+y<<" "<<dx+dy<<endl;
                        if ((x+y)<(dx+dy)) {dx=x;dy=y;}
                       // cout<<x<<" "<<y<<" "<<dx<<" "<<dy<<endl;
                    }
             }
            if (x) cout<<dx<<" "<<dy<<endl;
             else cout<<"No answer"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/mbcxm/p/3194772.html
Copyright © 2011-2022 走看看