//Autor          : Thorstensen Nicolas
//MatrikelNummer : 0006402
//BeispielNummer : 1201
//Beschreibung   : Eine Polynomfunktion soll beliebig oft differenziert werden

// reformated with idea (www.intellij.com) by heder

import eprog.EprogException;
import eprog.EprogIO;

class polydiff
{
  static boolean EingabeEnde = false;  //bestimmmt das ende der eingabe, wenn der Wert 999 eingegeben wird
  static boolean SpezError = false; // sollte Exception error auftreten wird diese Variable auf True geaendert
  static boolean InputError = false;
  static final int MAX = 11;	// Hoechste zugelassen Anzahl Koeffizienten
  static final int Upperlimit = 9; //KLassenvariable die den hoechst zugelassenen Grad des Polynoms fixieren
  static final int Lowerlimit = 0;//Klassenvariable um den niedrigste Potenz des Polynoms zu fixieren
  static final int Ende = 0;
  static int Grad = 0;  //bestimmt den Grad des Polynoms
  static int N = 0; //wie oft differenzieren
  static float Eingabe = 0; //Diese Float Variable dient der Speicherung der Eingabe

  int ElementGrad = 0; //Objektvariable fur das Objekt Polydiff, welche den Grad speichert
  float ElementKoeff = 0;//Objektvariable fuer das Objekt Polydiff, welche den Koeffizienten speichert

  polydiff(int i, float j)  //Hier wird das Objekt Polydiff definiert, welches zwei Eingabeparameter verlangt
  {
    this.ElementGrad = i;
    this.ElementKoeff = j;
  }

  void Differezieren() //Hier wird die Methode definiert um ein Objekt, bzw Polynom zu differenzieren
  {
    if (ElementGrad == 0)
      ElementKoeff = 0;
    ElementKoeff = ElementKoeff * ElementGrad;
    ElementGrad -= 1;
  }

  public static void main(String[] args)
  {
    try
    {

      Grad = EprogIO.readInt(); //Hier wird der Grad des Polynoms eingelesen
      if ((Grad < Lowerlimit) || (Grad > Upperlimit))//Hier wird ueberprueft,ob der Grad> Limit
      {
        SpezError = true;
        Grad = 0;//Grad wird auf null gestzt um Fehler bei den Arrays zu vermeiden falls <0
      }
      N = EprogIO.readInt();//Eingelesen wie oft der Polynom differenziert werden soll
      if ((N < 0))
        InputError = true;

    }
    catch (EprogException e) // ExceptionError abgefangen und InputError auf true gesetzt
    {
      InputError = true;
    }

    float[] KoeffArray = new float[MAX];//Hier wird ein Array definiert um die Koeffizientten zuspeichern

    try
    {
      int i = 0;
      while (KoeffArray[i] != 999)
      {
        Eingabe = EprogIO.readFloat(); //Hier werden die Koeffizienten eingelesen und gespeichert
        KoeffArray[i] = Eingabe;

        if (KoeffArray[i] == 999)
          break;
        i++;
      }
    }
    catch (EprogException e) //Hier wird ein ExceptionError abgefangen und InputError auf true gesetzt
    {
      InputError = true;
    }

    polydiff[] Elemente = new polydiff[Grad + 1]; //Hier wird ein Array Elemente mit Polydiff Objekten definiert

    for (int i = 0; i <= Grad; i++)
    {
      Elemente[i] = new polydiff((Grad - i), KoeffArray[i]);//Hier werden neue Polydiff Objekte mit den 																				entsprechenden Parametern definiert
    }

    for (int j = 0; j < N; j++) //Hier wird jedes Objekt des Array Elemente N-mal differenziert
    {
      for (int i = 0; i < Grad + 1; i++)
        Elemente[i].Differezieren();
    }

    if (InputError)									/*        AUSGABE                                           */
      EprogIO.print("?");
    else if (SpezError)
      EprogIO.print("FALSCHE EINGABE");
    else if (N > Grad)
      EprogIO.print(0 + " " + 0.000F);
    else
    {
      EprogIO.print(Elemente[0].ElementGrad);
      for (int i = 0; i <= Grad; i++)
      {
        if (Elemente[i].ElementGrad >= 0)
          EprogIO.print(" " + Elemente[i].ElementKoeff);
        else
          break;
      }
    }

    EprogIO.println("");
  }
}