### dificilcoder's blog

By dificilcoder, history, 18 months ago, How to arrive at the correct solution which solves for large input values?

Problem : Hard Compare...

Question

Given 4 numbers A,B,C and D. If AB > CD, print "YES" otherwise, print "NO".

Input
Only one line containing 4 numbers A,B,C and D (1≤A,C≤107) , (1≤B,D≤1012)

Output
Print "YES" or "NO" according to the problem above.

My Program

    #include <iostream>
#define ll long long
using namespace std;

int main(){

ll res1, res2, a, b, c, d;
cin>>a>>b>>c>>d;
res1 = 1;
res2 = 1;
for(int i=1;i<=b; i++){
res1 = a % ((int)1e9+7) *  res1 % ((int)1e9+7);
}
for(int i=1;i<=d; i++){
res2 = c % ((int)1e9+7) *  res2 % ((int)1e9+7);
}

cout<<(res1>res2 ? "YES" : "NO");
return 0;
}


TestCases

Input : 2887969 614604076030 8478041 209676100616

Input : 8376260 70 8376259 70

Input : 2 1 1 1

Input : 1 7816997 1 1

Issue with current program : I am not able to solve for large input values  Comments (13)
 » Take log both the sides and compare
•  » » thank U very much
•  » » how?
•  » » » Since $A, B, C, D > 1$We have $AB > CD \Leftrightarrow log_k(AB) > log_k(CD)$ for $k > 1$ You can also try $\frac{A}{C} > \frac{D}{B}$
•  » » » » but why the pow function doesn't work on that question??
•  » » » » » You can't use modulo before comparison.1 % (1e9 + 7) = 1 (1e9 + 7) % (1e9 + 7) = 0but 1 isn't greater than 1e9 + 7.
•  » » » » » maybe cause the tester tests it on huge numbers so your program gonna be mad
•  » » » » » » true
•  » » » » Below logic will fail on the TC 1 7816997 1 1
•  » » » » log functions will give you float values. Isn't it bad practice to compare floats?
 » I would say, just take the log, so you will get B*log(A) and D*log(C). this just removes the tension of long values which were giving errors in pow() function. Here is its implementation: if((B*log(A) < D*log(C))||(B*log(A) == D*log(C)) ) cout << "NO"; else cout << "YES"; 
 » As A^B > C^D , We Just take the log, so you will get b*log(a) and d*log(c)
»

# include <bits/stdc++.h>

using namespace std;

# define ll long long

int main() { ll a,b,c,d;//a^b<c^d---->b*log(a)<d*log(c) || b*log(a)==d*log(c) cin >>a>>b>>c>>d; if(b*log(a)<d*log(c) || b*log(a)==d*log(c)){ cout<<"NO"; }else{ cout<<"YES"; } return 0; }