链接:https://www.nowcoder.com/questionTerminal/44d0ee89b51b4725b403d1df2381d2b2
来源:牛客网
[编程题]分饼干
- 热度指数:4384时间限制:1秒空间限制:32768K
- 算法知识视频讲解
易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值
输入描述:
输入包括两行: 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 第二行为小朋友的人数n
输出描述:
输出k可能的数值种数,保证至少为1
示例1
输入
9999999999999X 3
输出
4
package go.jacob.day918;
import java.util.Scanner;
/**
* [编程题]分饼干
*
* @author Jacob
* Long表示范围为-9223372036854775808到9223372036854775807(19位)
*/
public class Demo1 {
/*
* 动态规划求解
* 用暴力解法会超时
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int len = s.length();
int n = sc.nextInt();
// dp[i][j]表示前i位(高位开始)余数为j的个数
long[][] dp = new long[len + 1][n];
dp[0][0] = 1;// 初始化
for (int i = 0; i < len; i++) {
for (int j = 0; j < n; j++) {
// 如果当前位为X,用0-9带入
if (s.charAt(i) == 'X') {
for (int k = 0; k <= 9; k++) {
dp[i + 1][(j * 10 + k) % n] += dp[i][j];
}
} else {// 如果当前位上的数字为不为X,用具体值带入
dp[i + 1][(j * 10 + s.charAt(i) - '0') % n] += dp[i][j];
}
}
}
System.out.println(dp[len][0]);
sc.close();
}
}