結果
問題 | No.195 フィボナッチ数列の理解(2) |
ユーザー | EmKjp |
提出日時 | 2015-04-29 01:50:04 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 29 ms / 5,000 ms |
コード長 | 6,656 bytes |
コンパイル時間 | 2,288 ms |
コンパイル使用メモリ | 114,052 KB |
実行使用メモリ | 26,104 KB |
最終ジャッジ日時 | 2024-07-05 16:31:19 |
合計ジャッジ時間 | 2,920 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 29 ms
24,028 KB |
testcase_01 | AC | 27 ms
21,808 KB |
testcase_02 | AC | 27 ms
26,104 KB |
testcase_03 | AC | 26 ms
23,724 KB |
testcase_04 | AC | 26 ms
25,840 KB |
testcase_05 | AC | 27 ms
21,944 KB |
testcase_06 | AC | 26 ms
24,060 KB |
testcase_07 | AC | 27 ms
24,188 KB |
testcase_08 | AC | 27 ms
23,932 KB |
testcase_09 | AC | 26 ms
21,940 KB |
testcase_10 | AC | 27 ms
24,156 KB |
testcase_11 | AC | 25 ms
24,028 KB |
testcase_12 | AC | 26 ms
23,984 KB |
testcase_13 | AC | 26 ms
24,028 KB |
testcase_14 | AC | 27 ms
24,112 KB |
testcase_15 | AC | 27 ms
25,852 KB |
testcase_16 | AC | 26 ms
25,976 KB |
testcase_17 | AC | 26 ms
24,028 KB |
testcase_18 | AC | 26 ms
23,988 KB |
testcase_19 | AC | 26 ms
24,024 KB |
testcase_20 | AC | 27 ms
23,936 KB |
testcase_21 | AC | 27 ms
21,940 KB |
testcase_22 | AC | 27 ms
23,896 KB |
testcase_23 | AC | 26 ms
21,808 KB |
testcase_24 | AC | 24 ms
21,688 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.IO; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; partial class Solver { /// <summary> /// ax + by = p /// cx + dy = q /// </summary> 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<T>(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<long>(); 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<String> TokenQueue = new Queue<string>(); 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; } } }