URAL 1036 - Lucky Tickets (高精度 + 基本计数)

题意

给出N,求有几种组合,使得前面N位数字的和和后面相等,并且相加为S。

思路

说好的容斥原理呢?( TДT)人与人之间最基本的信任都没了。

题目可以转化为求S/2有几种表示方法。

用dp[i][j] = dp[i - 1][j - k]

dp[i][j]表示前i位和为j的方案数。

代码

import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;
import java.math.*;
  
public class Main {
 
    static int MAXN = 1000 + 10;
  
    public static void main(String[] args) {
        Scanner in = new Scanner(new BufferedInputStream(System.in));
        BigInteger[][] dp = new BigInteger[55][MAXN];
        int S, i, j;
        while (in.hasNextInt()) {
            int n = in.nextInt();
            S = in.nextInt();
            if (S % 2 == 1) {
                System.out.println("0");
                continue;
            }
            S /= 2;
            for (i = 0; i <= n; i++) {
                for (j = 0; j <= S; j++) dp[i][j] = BigInteger.ZERO;
            }
            dp[0][0] = BigInteger.ONE;
              
            for (i = 1; i <= n; i++) {
                for (j = 0; j <= S; j++) {
                    for (int k = 0; k < 10; k++) {
                        if (k > j) continue;
                        dp[i][j] = dp[i][j].add(dp[i - 1][j - k]);
                    }
                }
            }
            System.out.println(dp[n][S].multiply(dp[n][S]));
        }
    }
}

Powered by Jekyll and Theme by solid