传送门: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());
}
}
}
如果觉得代码写得有问题的欢迎你们提出来~