Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Collections;
- namespace Decomposition
- {
- class Program
- {
- static void Main(string[] args)
- {
- int a, b, c;
- Init(out a, out b, out c);
- if (a >= b && a <= c)
- {
- WriteInt(1);
- return;
- }
- ArrayList denominators = new ArrayList();
- Fill(denominators, a);
- int indLeftBorder = -1;
- int indRightBorder = - 1;
- getRange(denominators, b, c, ref indLeftBorder, ref indRightBorder);
- Dictionary<int, int> NumOfWays = new Dictionary<int, int>();
- for (int i = 0; i < denominators.Count; i++)
- NumOfWays[(int)denominators[i]] = 0;
- int min = 0;
- GetWays(denominators, a, b, c, indLeftBorder, indLeftBorder, NumOfWays, ref min);
- FindMin(denominators, indLeftBorder, indLeftBorder, NumOfWays, min);
- return;
- }
- static void Init(out int a, out int b, out int c)
- {
- FileStream fin = new FileStream("input.txt", FileMode.OpenOrCreate);
- StreamReader fRead = new StreamReader(fin);
- string[] buff = fRead.ReadLine().Split(' ');
- fRead.Close();
- a = Int32.Parse(buff[0]);
- b = Int32.Parse(buff[1]);
- c = Int32.Parse(buff[2]);
- }
- static void Fill(ArrayList denominators, int a)
- {
- for (int i = 1; i <= Math.Sqrt(a); i++)
- {
- if (a % i == 0)
- denominators.Add(i);
- }
- for (int i = denominators.Count - 1; i >= 0; i--)
- denominators.Add(a / (int)denominators[i]);
- }
- static void getRange(ArrayList denominators, int b, int c, ref int indLeftBorder, ref int indRightBorder)
- {
- for (int i = 0; i < denominators.Count; i++)
- {
- if ((int)denominators[i] >= b)
- {
- indLeftBorder = i;
- break;
- }
- }
- for (int i = denominators.Count - 1; i >= 0; i--)
- {
- if ((int)denominators[i] <= c)
- {
- indRightBorder = i;
- break;
- }
- }
- if (b == 1)
- indLeftBorder++;
- if (indRightBorder < indLeftBorder)
- {
- WriteInt(-1);
- return;
- }
- }
- static void WriteInt(int answer)
- {
- FileStream fout = new FileStream("output.txt", FileMode.OpenOrCreate);
- StreamWriter fWrite = new StreamWriter(fout);
- fWrite.Write(answer.ToString());
- fWrite.Close();
- }
- static void GetWays(ArrayList denominators, int a, int b, int c, int indLeftBorder,
- int indRightBorder, Dictionary<int, int> numOfWays, ref int min)
- {
- for (int i = indRightBorder; a > c;)
- {
- if ((i == denominators.Count - 1) || numOfWays[a] > 0)
- {
- for (int j = indLeftBorder; j <= indRightBorder; j++)
- {
- if (a % (int)denominators[j] == 0)
- {
- int buff = a / (int)denominators[j];
- if (numOfWays[buff] == 0 || numOfWays[buff] > numOfWays[a] + 1)
- numOfWays[buff] = numOfWays[a] + 1;
- if (buff >= b && buff <= c)
- min = numOfWays[buff];
- }
- }
- }
- a = (int)denominators[--i];
- }
- }
- static void FindMin(ArrayList denominators, int indLeftBorder,
- int indRightBorder, Dictionary<int, int> Steps, int min)
- {
- if (min != 0)
- {
- for (int i = indLeftBorder; i <= indRightBorder; i++)
- {
- if (Steps[(int)denominators[i]] < min && Steps[(int)denominators[i]] > 0)
- min = Steps[(int)denominators[i]];
- }
- WriteInt(min + 1);
- return;
- }
- WriteInt(-1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement