问题描述
给定n和m以及p,保证n>=m,求(n!-m!)对p取余的结果。
输入格式
一行三个正整数n,m,p。
输出格式
一行一个非负整数表示结果。
样例输入
3 2 10
样例输出
4
数据规模和约定
n,m<=20,p<=10000.
资源限制
时间限制:1.0s 内存限制:256.0MB
思路:
因为阶乘的变化量是非常大的,如果是50的阶乘,那么不管是int还long型,都不够用!
这时我们就需要使用大数类,即BigInteger类。
因为题目简单,那我就不多赘述了,上代码吧……
代码块:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
BigInteger n = sc.nextBigInteger();
BigInteger m = sc.nextBigInteger();
BigInteger p = sc.nextBigInteger();
BigInteger sumN = new BigInteger("1");//结果值:n
BigInteger sumM = new BigInteger("1");//结果值:m
BigInteger n1 = new BigInteger("1");
BigInteger n2 = new BigInteger("1");//不变:1(n)
BigInteger m1 = new BigInteger("1");
BigInteger m2 = new BigInteger("1");//不变:1(m)
BigInteger t = new BigInteger("0");//不变:0
//System.out.println(n+" "+m+" "+p+" "+sumN+" "+sumM);
//System.out.println(n1+" "+n2+" "+m1+" "+m2+" "+t);
//求sumN
while(true){
sumN = sumN.multiply(n1);
n1 = n1.add(n2);
n = n.subtract(n2);
if(n.equals(t)){
break;
}
}
//System.out.println(sumN);
//求sumM
while(true){
sumM = sumM.multiply(m1);
m1 = m1.add(m2);
m = m.subtract(m2);
if(m.equals(t)){
break;
}
}
//System.out.println(sumM);
BigInteger res = sumN.subtract(sumM);
System.out.println(res.mod(p));
}
}
最后在注意一下,大数类之间判断是否相等,必须使用equals,否者false;使用BigINteger需要引用import java.math.BigInteger;