【AC梦工厂】广工华工联合训练6 K

来源:互联网 发布:淘宝下架时间规则 编辑:程序博客网 时间:2024/06/05 04:56

传送门:https://vjudge.net/contest/189920#problem/K

题意:

大数错排,错排公式:F[i]=(i-1)*(F[i-1]+F[i-1])

代码:(记录下第一次java ac)

import java.io.*;import java.math.BigDecimal;import java.math.BigInteger;import java.util.Scanner;public class miaomiaomiao {    static BigInteger cmn(int n,int r)    {        BigInteger ans1=BigInteger.valueOf(1);        BigInteger ans2=BigInteger.valueOf(1);        BigInteger ans3=BigInteger.valueOf(1);        for(int i=1;i<=n;i++){            ans1=ans1.multiply(BigInteger.valueOf(i));        }        for(int i=1;i<=r;i++){            ans2=ans2.multiply(BigInteger.valueOf(i));        }        for(int i=1;i<=n-r;i++){            ans3=ans3.multiply(BigInteger.valueOf(i));        }        return ans1.divide((ans2.multiply(ans3)));    }    static BigInteger st(int n)    {        BigInteger ans1=BigInteger.valueOf(1);        for(int i=1;i<=n;i++){            ans1=ans1.multiply(BigInteger.valueOf(i));        }        return ans1;    }    static BigInteger gcd(BigInteger a,BigInteger b)    {        return a.gcd(b);    }    public static void main(String[] args) {        int n,k;        Scanner sc=new Scanner(System.in);        k=sc.nextInt();        n=sc.nextInt();        if(n==k){            System.out.println("1"+"/"+st(n).toString());        }else{            BigInteger[] s=new BigInteger[200];            s[1]=new BigInteger("0");            s[2]=new BigInteger("1");            for(int i=3;i<=100;i++){                BigInteger k1=BigInteger.valueOf(i-1);                s[i]=k1.multiply((s[i-1].add(s[i-2])));            }            BigInteger zi;            BigInteger mu;            zi=cmn(n,k).multiply(s[n-k]);            mu=st(n);//          System.out.println(cmn(n,k));//          System.out.println(s[k].toString());//          System.out.println(zi.toString());//          System.out.println(mu.toString());//          System.out.println(gcd(zi,mu).toString());            BigInteger d=gcd(zi,mu);            zi=zi.divide(d);            mu=mu.divide(d);            if(zi.toString()=="0")                System.out.println("0");            else if(zi.toString()==mu.toString())                System.out.println("1");            else                System.out.println(zi.toString()+"/"+mu.toString());        }    }}

如果觉得代码写得有问题的欢迎你们提出来~