Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.math.BigInteger;
- import java.util.StringTokenizer;
- public class Main11 {
- public static void main(String[] args) throws IOException {
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
- init(in);
- solve();
- print(out);
- in.close();
- out.close();
- }
- static int n, m, k,r;
- static BigInteger[][][] dp;
- static BigInteger ans = new BigInteger("0");
- private static void init(BufferedReader in) throws IOException {
- StringTokenizer st = new StringTokenizer(in.readLine());
- n = Integer.parseInt(st.nextToken());
- m = Integer.parseInt(st.nextToken());
- k = Integer.parseInt(st.nextToken());
- r = Integer.parseInt(st.nextToken());
- }
- private static void solve() {
- n =n-m*r; //вычитаем использованные фломастеры
- if (n<0){
- return;
- }
- dp = new BigInteger[m][n + 1][k+1]; // массив [колво коробок][оставшиеся фломастеры +1][максимум+1]
- k = Math.min(k, n); //к = минимум из оставшихся фломастеров и максимума
- for (int i = 0; i < k + 1; i++){
- dp[0][i][i] = new BigInteger("1"); //заполняем диагональ единицей
- }
- for (int j = 1; j < m; j++){
- for (int i = 0; i < Math.min(n,(j+1)*k) + 1; i++){
- for (int w = 0; w < Math.min(i, k) + 1; w++) {
- if (w*(j+1)>n){
- break;
- }
- dp[j][i][w] = new BigInteger("0");
- for (int q = w; q <= k; q++) {
- if (q*j+w>i){
- break;
- }
- if (dp[j - 1][i - w][q] != null) {
- dp[j][i][w] = dp[j][i][w].add(dp[j - 1][i - w][q]);
- }
- }
- }
- }
- }
- if (dp[m - 1][n] != null) {
- for (int w = 0; w < k + 1; w++){
- if (dp[m - 1][n][w] != null){
- ans = ans.add(dp[m - 1][n][w]);
- }
- }
- }
- }
- private static void print(PrintWriter out) throws IOException {
- out.print(ans.toString());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement