小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。
输入描述:
每个输入包含一个测试用例。 每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。 接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。
输出描述:
输出一个整数,表示组成歌单的方法取模。因为答案可能会很大,输出对1000000007取模的结果。
输入例子1:
5 2 3 3 3
输出例子1:
9
杨辉三角:
c[4][2],表示从4个里面取2个===》6
public static void Initial(long[][] array){
array[0][0] = 1;
for(int i = 1;i <= 100;i++){
array[i][0] = 1;
for(int j = 1;j <= 100;j++){
array[i][j] =( array[i-1][j-1] + array[i-1][j])%1000000007;;
}
}
满足条件:
①、i 首长度位 A 的歌总长度小于 k
条件一:i * A <= k
②、k 减去 i * A 后对长度为 B 的歌取模等于 0
条件二:(k - i * A)%B == 0
③、k 减去 i * A 后整除 B 小于等于 Y
条件三:((k - i * A)/B)<= Y
即:(i * A <= k)&& ((k - i * A)%B == 0 )&& (((k - i * A)/B)<= Y)
满足该条件后进行排列组合计算
从 X 首歌中选 i 首,从 Y 首中选 ((k - i * A)/ B),相乘得到结果,对1000000007取模输出
package hellojava;
import java.util.Scanner;
import jdk.internal.org.objectweb.asm.tree.IntInsnNode;
public class Main {
public static long[][] array = new long[101][101];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int k = in.nextInt();
int A = in.nextInt();
int X = in.nextInt();
int B = in.nextInt();
int Y = in.nextInt();
inital(array);
System.out.println(calc(k, X, A, Y, B));
}
public static void inital(long[][] array) {
array[0][0] = 1;
for(int i = 1;i <= 100;i++){
array[i][0] = 1;
for(int j = 1;j <= 100;j++){
array[i][j] =( array[i-1][j-1] + array[i-1][j])%1000000007;
}
}
}
public static long calc(int k,int X,int A,int Y,int B) {
long result = 0;
int len;
for(int i = 0;i <= X;i++) {
len = k - A*i;
if(len >= 0 && (len % B) == 0 && (len /B) <= Y) {
result += (array[X][i] * array[Y][len/B])%1000000007;
}
}
return result%1000000007;
}
}