题目1 : 矩阵填数
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右、每一列从上到下都是递增的。
例如如下是3x3的一种填法:
136 247 589
给定N和M,小Hi希望知道一共有多少种不同的填法。
输入
一行包含两个整数N和M。
对于60%的数据 1 <= N <= 2, 1 <= M <= 100000
对于20%的数据 N = 3, 1 <= M <= 100
对于100%的数据 1 <= N <= 3, 1 <= M <= 100000
输出
输出一共有多少种不同的填法。由于结果可能很大,你只需输出答案模109+7的余数。
样例输入
3 2
样例输出
5
import java.util.Scanner;
public class Main {
public static final long MOD=1000000007;
public static void main(String[] args){
int N;
long M,result;
FastPow fastPow=new FastPow();
Scanner scanner=new Scanner(System.in);
N=scanner.nextInt();
M=scanner.nextLong();
result=1;
for(long i=N*M;i>0;i--){
result=result*i%MOD;
}
for(long i=N+M-1;i>=M;i--) {
for (long j = i; j > i-M; j--) {
result=result*fastPow.fastpow(j, 1000000005)%MOD;
}
}
System.out.println(result);
}
}
class FastPow{
public final long MOD=1000000007;
public long fastpow(long n, int k){
long ans = 1,num;
int t;
for (num = n, t = k; t>0; num = num * num % MOD, t >>= 1)
if ((t & 1)!=0) ans = ans * num % MOD;
return ans;
}
}