using System; using System.IO; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; partial class Solver { /// /// ax + by = p /// cx + dy = q /// static bool CramersRule(long a, long b, long p, long c, long d, long q, out long x, out long y) { x = 0; y = 0; long det = a * d - b * c; if (det == 0) return false; long pdbq = p * d - b * q; long aqpc = a * q - p * c; if (pdbq % det != 0) return false; if (aqpc % det != 0) return false; x = pdbq / det; y = aqpc / det; return true; } public static void Swap(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = rhs; rhs = temp; } static public long ExtendedGcd(long a, long b, ref long x, ref long y) { if (b == 0) { x = 1; y = 0; return a; } else { long d = ExtendedGcd(b, a % b, ref y, ref x); y -= a / b * x; return d; } } static public bool ChineseRemainderTheorem(long a1, long m1, long a2, long m2, ref long val, ref long mod) { a1 %= m1; a2 %= m2; if (a1 > a2) return ChineseRemainderTheorem(a2, m2, a1, m1, ref val, ref mod); long A = 0, B = 0, g = ExtendedGcd(m1, m2, ref A, ref B); if (a1 % g != a2 % g) return false; long M = a1 % g; a1 /= g; m1 /= g; a2 /= g; m2 /= g; long k = (A + m2) * (a2 - a1) % m2; mod = m1 * m2 * g; val = ((a1 + k * m1) * g + M) % mod; return true; } static public long Inverse(long a, long mod) { long x = 0, y = 0; if (ExtendedGcd(a, mod, ref x, ref y) == 1) return (x + mod) % mod; else return -1; } public void Run() { long X = nl(); long Y = nl(); long Z = nl(); if (X > Y) Swap(ref X, ref Y); if (X > Z) Swap(ref X, ref Z); if (Y > Z) Swap(ref Y, ref Z); if (X == Y) Swap(ref Y, ref Z); var fib = new List(); fib.Add(1); fib.Add(0); fib.Add(1); while (true) { var x = fib[fib.Count - 2] + fib[fib.Count - 1]; if (x > 2000000000) break; fib.Add(x); } long ansA = -1, ansB = -1; if (X == Y && Y == Z) { for (int i = 0; i < fib.Count - 1; i++) { if (fib[i + 1] == 0) continue; long A = 0, B = 0; // fib[i] * A + fib[i+1] * B = X // B = (X - fib[i] * A) / fib[i+1] // X - fib[i] * A = 0 (mod fib[i+1] // fib[i] * A = X // A = X * inv(fib[i]) mod fib[i+1] if (fib[i + 1] == 1) { A = 1; } else { A = X * Inverse(fib[i], fib[i + 1]) % fib[i + 1]; } B = (X - fib[i] * A) / (fib[i + 1]); if (A > 0 && B > 0) { if (ansA == -1 || (ansA > A || (ansA == A && ansB > B))) { ansA = A; ansB = B; } } } } else { for (int i = 0; i < fib.Count - 1; i++) { for (int j = 0; j < fib.Count - 1; j++) { // fib[i] * A + fib[i+1] * B = X // fib[j] * A + fib[j+1] * B = Y long A, B; if (CramersRule(fib[i], fib[i + 1], X, fib[j], fib[j + 1], Y, out A, out B)) { if (A > 0 && B > 0) { for (int k = 0; k < fib.Count - 1; k++) { if (fib[k] * A + fib[k + 1] * B == Z) { if (ansA == -1 || (ansA > A || (ansA == A && ansB > B))) { ansA = A; ansB = B; } } } } } } } } if (ansA == -1) cout.WriteLine(-1); else cout.WriteLine("{0} {1}", ansA, ansB); } } // PREWRITEN CODE BEGINS FROM HERE partial class Solver : Scanner { public static void Main(string[] args) { new Solver(Console.In, Console.Out).Run(); } TextReader cin; TextWriter cout; public Solver(TextReader reader, TextWriter writer) : base(reader) { this.cin = reader; this.cout = writer; } public Solver(string input, TextWriter writer) : this(new StringReader(input), writer) { } public int ni() { return NextInt(); } public long nl() { return NextLong(); } public string ns() { return Next(); } } public class Scanner { private TextReader Reader; private Queue TokenQueue = new Queue(); private CultureInfo ci = CultureInfo.InvariantCulture; public Scanner() : this(Console.In) { } public Scanner(TextReader reader) { this.Reader = reader; } public int NextInt() { return Int32.Parse(Next(), ci); } public long NextLong() { return Int64.Parse(Next(), ci); } public double NextDouble() { return double.Parse(Next(), ci); } public string[] NextArray(int size) { var array = new string[size]; for (int i = 0; i < size; i++) array[i] = Next(); return array; } public int[] NextIntArray(int size) { var array = new int[size]; for (int i = 0; i < size; i++) array[i] = NextInt(); return array; } public long[] NextLongArray(int size) { var array = new long[size]; for (int i = 0; i < size; i++) array[i] = NextLong(); return array; } public String Next() { if (TokenQueue.Count == 0) { if (!StockTokens()) throw new InvalidOperationException(); } return TokenQueue.Dequeue(); } public bool HasNext() { if (TokenQueue.Count > 0) return true; return StockTokens(); } private bool StockTokens() { while (true) { var line = Reader.ReadLine(); if (line == null) return false; var tokens = line.Trim().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0) continue; foreach (var token in tokens) TokenQueue.Enqueue(token); return true; } } }