题意:问n个人的不同的排名方式有多少种,多个人可能处在同一个名次。
分析: 递推了。公式也很容易写出来。 f[i][j]表示有i个人,j个不同的名次(可能多个人在同一个名次)的方案数.
f[i][j]=f[i-1][j]*j+f[i-1][j-1]*j;  因为i个人排成j个档次可以在i-1个人j个档次的基础上随便找个档次(共有j个档次)加上第i个人,也可以在i-1个人j-1个档次的基础上让第i个人独立作为一个档次随意排,有j个位置。答案就是sigma{f[n][i] | i从1到n}。 这题要用大数。于是我的第一个java程序诞生了,乱搞查资料,debug了半天,终于写出来了,很丑的。自我鄙视一下。
import java.io.*;
import java.util.*;
import java.math.*;
import java.text.*;

public class Main
{
    
static int n;
    
static BigInteger ans=new BigInteger("0");
    
static BigInteger tem=new BigInteger("0");
    
static BigInteger tt=new BigInteger("0");
    
static BigInteger[][] f = new BigInteger[210][210];
    
static int zero=0;
    
public static void main(String[] args) 
    
{
        ini();
        Scanner cin
=new Scanner(new BufferedInputStream(System.in));
        
while((n=cin.nextInt())>=0)
        
{
            ans
=ans.valueOf(0);
            
for(int i=1;i<=n;i++) ans=ans.add(f[n][i]);
            System.out.println(ans);
        }

    }

    
public static void ini()
    
{
        
for(int i=1;i<=200;i++)
        
{
            
for(int j=1;j<=200;j++) f[i][j]=f[i][j].valueOf(0);
        }

        
for(int i=1;i<=200;i++
        
{
            f[i][
1]=f[i][1].valueOf(1);
        }

        
for(int i=2;i<=200;i++)
        
{
            
for(int j=2;j<=i;j++)
            
{
                f[i][j]
=f[i][j].valueOf(0);
                tem
=tem.valueOf(j);
                tt
=f[i-1][j].multiply(tem);
                f[i][j]
=f[i][j].add(tt);
                tt
=f[i-1][j-1].multiply(tem);
                f[i][j]
=f[i][j].add(tt);
            }

        }

    }

}