Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.46 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Collections;
  5.  
  6. namespace Decomposition
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             int a, b, c;
  13.             Init(out a, out b, out c);
  14.             if (a >= b && a <= c)
  15.             {
  16.                 WriteInt(1);
  17.                 return;
  18.             }
  19.             ArrayList denominators = new ArrayList();
  20.             Fill(denominators, a);
  21.  
  22.             int indLeftBorder = -1;
  23.             int indRightBorder = - 1;
  24.             getRange(denominators, b, c, ref indLeftBorder, ref indRightBorder);
  25.  
  26.  
  27.             Dictionary<int, int> NumOfWays = new Dictionary<int, int>();
  28.             for (int i = 0; i < denominators.Count; i++)
  29.                 NumOfWays[(int)denominators[i]] = 0;
  30.             int min = 0;
  31.  
  32.             GetWays(denominators, a, b, c, indLeftBorder, indLeftBorder, NumOfWays, ref min);
  33.  
  34.             FindMin(denominators, indLeftBorder, indLeftBorder, NumOfWays, min);
  35.  
  36.  
  37.             return;
  38.  
  39.         }
  40.  
  41.         static void Init(out int a, out int b, out int c)
  42.         {
  43.             FileStream fin = new FileStream("input.txt", FileMode.OpenOrCreate);
  44.             StreamReader fRead = new StreamReader(fin);
  45.  
  46.             string[] buff = fRead.ReadLine().Split(' ');
  47.             fRead.Close();
  48.             a = Int32.Parse(buff[0]);
  49.             b = Int32.Parse(buff[1]);
  50.             c = Int32.Parse(buff[2]);
  51.         }
  52.  
  53.         static void Fill(ArrayList denominators, int a)
  54.         {
  55.             for (int i = 1; i <= Math.Sqrt(a); i++)
  56.             {
  57.                 if (a % i == 0)
  58.                     denominators.Add(i);
  59.             }
  60.             for (int i = denominators.Count - 1; i >= 0; i--)
  61.                 denominators.Add(a / (int)denominators[i]);
  62.         }
  63.  
  64.         static void getRange(ArrayList denominators, int b, int c, ref int indLeftBorder, ref int indRightBorder)
  65.         {
  66.             for (int i = 0; i < denominators.Count; i++)
  67.             {
  68.                 if ((int)denominators[i] >= b)
  69.                 {
  70.                     indLeftBorder = i;
  71.                     break;
  72.                 }
  73.             }
  74.             for (int i = denominators.Count - 1; i >= 0; i--)
  75.             {
  76.                 if ((int)denominators[i] <= c)
  77.                 {
  78.                     indRightBorder = i;
  79.                     break;
  80.                 }
  81.             }
  82.             if (b == 1)
  83.                 indLeftBorder++;
  84.             if (indRightBorder < indLeftBorder)
  85.             {
  86.                 WriteInt(-1);
  87.                 return;
  88.             }
  89.         }
  90.  
  91.         static void WriteInt(int answer)
  92.         {
  93.             FileStream fout = new FileStream("output.txt", FileMode.OpenOrCreate);
  94.             StreamWriter fWrite = new StreamWriter(fout);
  95.  
  96.             fWrite.Write(answer.ToString());
  97.             fWrite.Close();
  98.         }
  99.  
  100.         static void GetWays(ArrayList denominators, int a, int b, int c, int indLeftBorder,
  101.             int indRightBorder, Dictionary<int, int> numOfWays, ref int min)
  102.         {
  103.             for (int i = indRightBorder; a > c;)
  104.             {
  105.                 if ((i == denominators.Count - 1) || numOfWays[a] > 0)
  106.                 {
  107.                     for (int j = indLeftBorder; j <= indRightBorder; j++)
  108.                     {
  109.                         if (a % (int)denominators[j] == 0)
  110.                         {
  111.                             int buff = a / (int)denominators[j];
  112.                             if (numOfWays[buff] == 0 || numOfWays[buff] > numOfWays[a] + 1)
  113.                                 numOfWays[buff] = numOfWays[a] + 1;
  114.                             if (buff >= b && buff <= c)
  115.                                 min = numOfWays[buff];
  116.                         }
  117.                     }
  118.                 }
  119.                 a = (int)denominators[--i];
  120.             }
  121.         }
  122.  
  123.         static void FindMin(ArrayList denominators, int indLeftBorder,
  124.             int indRightBorder, Dictionary<int, int> Steps, int min)
  125.         {
  126.             if (min != 0)
  127.             {
  128.                 for (int i = indLeftBorder; i <= indRightBorder; i++)
  129.                 {
  130.                     if (Steps[(int)denominators[i]] < min && Steps[(int)denominators[i]] > 0)
  131.                         min = Steps[(int)denominators[i]];
  132.                 }
  133.                 WriteInt(min + 1);
  134.                 return;
  135.             }
  136.             WriteInt(-1);
  137.         }
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement