zoukankan      html  css  js  c++  java
  • HDU 5974 数学

    A Simple Math Problem

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 2891    Accepted Submission(s): 907


    Problem DescriptionGiven two positive integers a and b,find suitable X and Y to meet the conditions: 

    X+Y=a
    Least
    Common Multiple (X, Y) =b
     
    Input
    Input includes multiple sets of test data.Each test data occupies one line,including two positive integers a(1≤a≤2*10^4),b(1≤b≤10^9),and their meanings are shown in the description.Contains most of the 12W test cases.
     
    Output
    For each set of input data,output a line of two integers,representing X, Y.If you cannot find such X and Y,output one line of "No Solution"(without quotation).
     
    Sample Input
    6 8 798 10780
     
    Sample Output
    No Solution 308 490
     

    题意:给你 x+y=a, lcm(x,y)=b 求 a,b

    思路:

    易得:x/gcd+y/gcd=a/gcd, x/gcd*y/gcd=b/gcd; 令i=x/gcd, j=y/gcd; 即i*gcd+j*gcd=a,i*j*gcd=b ==> gcd(a,b)=gcd(x,y);解个方程即可。

    PS:刚开始用的枚举gcd的方法,复杂度1e7,但是一直WA??? 

    代码:

     1 #include<bits/stdc++.h>
     2 //#include<regex>
     3 #define db double
     4 #include<vector>
     5 #define ll long long
     6 #define vec vector<ll>
     7 #define Mt  vector<vec>
     8 #define ci(x) scanf("%d",&x)
     9 #define cd(x) scanf("%lf",&x)
    10 #define cl(x) scanf("%lld",&x)
    11 #define pi(x) printf("%d
    ",x)
    12 #define pd(x) printf("%f
    ",x)
    13 #define pl(x) printf("%lld
    ",x)
    14 #define MP make_pair
    15 #define PB push_back
    16 #define inf 0x3f3f3f3f3f3f3f3f
    17 #define fr(i,a,b) for(int i=a;i<=b;i++)
    18 const int N=1e3+5;
    19 const int mod=1e9+7;
    20 const int MOD=mod-1;
    21 const db  eps=1e-18;
    22 const db  PI=acos(-1.0);
    23 using namespace std;
    24 map<ll,int> mp;
    25 int main(){
    26 //freopen("data.in","r",stdin);
    27 //freopen("data.out","w",stdout);
    28     ll a,b;
    29     for(int i=0;i<=20005;i++){
    30         ll x=1ll*i*i;
    31         mp[x]=i;
    32     }
    33     while(scanf("%lld%lld",&a,&b)==2){
    34         bool ok=0;
    35         ll i=__gcd(a,b);
    36 //        for(ll i=1;i*i<=a;i++) {
    37             if(a%i==0&&b%i==0){
    38                 ll bb=b/i,aa=a/i,y=aa*aa-4*bb;
    39                 if(y<0||!mp.count(y)||(aa+mp[y])%2==1){printf("No Solution
    ");continue;}
    40                 ll ans1=(aa+mp[y])/2;
    41                 ll ans2=(aa-mp[y])/2;
    42                 ans1*=i,ans2*=i;
    43                 ll cnt1=a-ans1,cnt2=a-ans2;
    44                 if(cnt1*ans1/__gcd(cnt1,ans1)==b){
    45                     printf("%lld %lld
    ",cnt1,ans1);
    46                 }
    47                 else if(cnt2*ans2/__gcd(cnt2,ans2)==b){
    48                     printf("%lld %lld
    ",cnt2,ans2);
    49                 }
    50             }
    51 //        }
    52 
    53     }
    54     return 0;
    55 }
     
     
  • 相关阅读:
    Codeforces
    Codeforces
    SCUT
    模板
    SCUT
    SCUT
    模板
    SCUT
    UVA 437 "The Tower of Babylon" (DAG上的动态规划)
    UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)
  • 原文地址:https://www.cnblogs.com/mj-liylho/p/7625703.html
Copyright © 2011-2022 走看看