Advertisement
Graf_Rav

Untitled

Feb 10th, 2018
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.52 KB | None | 0 0
  1. import java.io.*;
  2. import java.math.BigInteger;
  3. import java.util.StringTokenizer;
  4.  
  5. public class Main11 {
  6.  
  7.     public static void main(String[] args) throws IOException {
  8.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  9.         PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  10.         init(in);
  11.         solve();
  12.         print(out);
  13.         in.close();
  14.         out.close();
  15.     }
  16.  
  17.     static int n, m, k,r;
  18.     static BigInteger[][][] dp;
  19.     static BigInteger ans = new BigInteger("0");
  20.     private static void init(BufferedReader in) throws IOException {
  21.         StringTokenizer st = new StringTokenizer(in.readLine());
  22.         n = Integer.parseInt(st.nextToken());
  23.         m = Integer.parseInt(st.nextToken());
  24.         k = Integer.parseInt(st.nextToken());
  25.         r = Integer.parseInt(st.nextToken());
  26.     }
  27.  
  28.     private static void solve() {
  29.         n =n-m*r; //вычитаем использованные фломастеры
  30.         if (n<0){
  31.                 return;
  32.         }
  33.  
  34.         dp = new BigInteger[m][n + 1][k+1]; // массив [колво коробок][оставшиеся фломастеры +1][максимум+1]
  35.         k = Math.min(k, n); //к = минимум из оставшихся фломастеров и максимума
  36.  
  37.         for (int i = 0; i < k + 1; i++){
  38.             dp[0][i][i] = new BigInteger("1"); //заполняем диагональ единицей
  39.         }
  40.  
  41.         for (int j = 1; j < m; j++){
  42.             for (int i = 0; i < Math.min(n,(j+1)*k) + 1; i++){
  43.                 for (int w = 0; w < Math.min(i, k) + 1; w++) {
  44.                     if (w*(j+1)>n){
  45.                             break;
  46.                     }
  47.                     dp[j][i][w] = new BigInteger("0");
  48.                     for (int q = w; q <= k; q++) {
  49.                         if (q*j+w>i){
  50.                                 break;
  51.                         }
  52.                         if (dp[j - 1][i - w][q] != null) {
  53.                             dp[j][i][w] = dp[j][i][w].add(dp[j - 1][i - w][q]);
  54.                         }
  55.                     }
  56.                 }
  57.             }
  58.         }
  59.  
  60.         if (dp[m - 1][n] != null) {
  61.             for (int w = 0; w < k + 1; w++){
  62.                 if (dp[m - 1][n][w] != null){
  63.                     ans = ans.add(dp[m - 1][n][w]);
  64.                 }
  65.             }
  66.         }
  67.  
  68.     }
  69.  
  70.     private static void print(PrintWriter out) throws IOException {
  71.         out.print(ans.toString());
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement