import javax.swing.*;
    
public class Comb 
{   
    public static long Fattoriale ( long numero )
    {
        long fattoriale = 1;	
        for ( long i = numero; i > 0; i-- )
            fattoriale *= i;
        return fattoriale;
    }
    
    public static long Pedice ( long dominio, long codominio )
    {
        long pedice = 1;
        for ( int i = 0; i < dominio; codominio--, i++ )
            pedice *= codominio;

        return pedice;
    }
    
    public static long Multinsieme ( long n, long k )
    {
        long finale = n + k - 1;
        finale = Pedice(k, finale);

        return finale;
    }
    
    public static long S ( long n, long k )
    {
        if ( n == k || k == 1 )
            return 1;
        else
            if ( k == 0 )
                return 0;
            else
            	return S(n - 1, k - 1) + k * S(n - 1, k);
    }
    
    public static long Suriezioni ( long n )
    {
        long finale = 0;
        for ( int k = 0; k <= n; k++ )
            finale += Fattoriale(k) * S(n, k);
            
        return finale;
    }
    
    public static long Partizioni ( long n )
    {
        long finale = 0;
        for ( int k = 0; k <= n; k++ )
            finale += S(n, k);
            
        return finale;
    }
           
    public static void main ( String args[] )
    {
        int scelta = 0, n, k;
        char sn, k1, k2;
        long len, finale = 1, cont = 0;
        
        while ( scelta != 5 )
        {
            scelta = Integer.parseInt(JOptionPane.showInputDialog("1) Suriezioni\n2) Multinsieme\n3) Parole non decrescenti\n4) Partizioni\n5) Uscire\nScegli cosa vuoi fare"));
        
            switch(scelta)
            {
                case 1: n = Integer.parseInt(JOptionPane.showInputDialog("Scrivi n"));
                        JOptionPane.showMessageDialog(null, "Il risultato e': " + Suriezioni(n));   
                        break;  
                        
                case 2: n = Integer.parseInt(JOptionPane.showInputDialog("Scrivi n"));
                        k = Integer.parseInt(JOptionPane.showInputDialog("Scrivi k"));
                        JOptionPane.showMessageDialog(null, "Il risultato e': " + Multinsieme(n, k));
                        break;            
                
                case 3: JOptionPane.showMessageDialog(null, "Spiegazione");                                                                        
                        n = Integer.parseInt(JOptionPane.showInputDialog("Scrivi n"));
                        k = Integer.parseInt(JOptionPane.showInputDialog("Scrivi k"));
                        JOptionPane.showMessageDialog(null, "Il risultato e': " + Multinsieme(n, k) / Fattoriale (k));                    
                        break;
                        
                case 4: n = Integer.parseInt(JOptionPane.showInputDialog("Scrivi n"));
                        JOptionPane.showMessageDialog(null, "Il risultato e': " + Partizioni(n));
                        break;
                        
                case 5: JOptionPane.showMessageDialog(null, "Programma terminato"); break;
                default: JOptionPane.showMessageDialog(null, "Scelta non possibile" ); break;
            }
        }
    }
}

























