[编程题] 分饼干
时间限制:1秒
空间限制:32768K
易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值
输入描述:
输入包括两行: 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 第二行为小朋友的人数n
输出描述:
输出k可能的数值种数,保证至少为1
输入例子:
9999999999999X 3
输出例子:
4
设dp[i][j]表示前i个数字且余数为j的可能数。 则递推公式为
dp[i][newj] += dp[i-1][j]
其中newj表示由前i-1位组成的数对n的余数和第i位组成的新数 对n 的余数
最后的结果为dp[len][0],即所有位且余数为0的可能性
#include<iostream>
#include<string>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<memory.h>
#include<set>
#include<map>
#include<bits/stdc++.h>
using namespace std;
int main() {
// freopen("input.txt","r",stdin);
string str;
int n;
cin>>str>>n;
long long dp[20][10004];
memset(dp,0,sizeof(dp));
dp[0][0] =1 ;
int len = (int)str.length();
for(int i = 1; i <= len; i++) {
for(int j = 0; j < n; j++) {
if(str[i-1] == 'X') {
for(int k = 0; k < 10; k++) {
int newj = (j * 10 + k) % n;
dp[i][newj] += dp[i-1][j];
}
}
else {
int newj = (j * 10 + str[i-1] - '0') % n;
dp[i][newj] += dp[i-1][j];
}
}
}
cout<<dp[len][0]<<endl;
return 0;
}