D - Digits Parade (AtCoder Beginner Contest 135) dp解法

题目链接:https://atcoder.jp/contests/abc135/tasks/abc135_d

Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 400 points

Problem Statement

Given is a string S. Each character in S is either a digit (0, ..., 9) or ?.

Since the answer can be enormous, print the count modulo 109+7.

Constraints

  • S is a string consisting of digits (0, ..., 9) and ?.
  • 1≤|S|≤105

Input

Input is given from Standard Input in the following format:

S

Output

Print the number of integers satisfying the condition, modulo 109+7.

Sample Input 1 

??2??5

Sample Output 1 

768

For example, 482305,002865, and 972665 satisfy the condition.

Sample Input 2 

?44

Sample Output 2

1

Only 044 satisfies the condition.

Sample Input 3 

7?4

Sample Output 3 

0

We may not be able to produce an integer satisfying the condition.

Sample Input 4 

?6?42???8??2??06243????9??3???7258??5??7???????774????4?1??17???9?5?70???76???

Sample Output 4 

153716888

 

题目意思:

给你一个数(1<=数的位数<=1e5),中间包含任意位'?','?'可以是'0'~'9'中的任意数,求有满足被13整除后余5的数的个数。

 

解题思路:

用dp解,dp数组记录第一位到第i位数为止的数整除13余k的个数,最后输出最后一位整除13余5的数的个数。

 

代码:

#include
#include
#include
#include
#include 
using namespace std;
const int M = 1e5 + 50;
long long dp[M][13] = {0};//dp[a][b],表示到第a位对13整除,余数为b的数有多少个 
const int MOD = 1e9 + 7;
int main(){
	string s;
	cin>>s;
	memset(dp,0,sizeof(dp));	//初始化dp数组为0 
	if(s[0] == '?'){			//判断第一位数 
		for(int i = 0; i < 10;i++)	//如果第一位为'?',则第一位余数可以是0~9 
			dp[0][i] = 1;
	}
	else
		dp[0][s[0]-'0'] = 1;	//如果第一位有数,则余数为该数 
	for(int i = 1; i < s.length();i++){		//遍历剩余位置的数 
		if(s[i] == '?'){		//如果是'?',该位可以是0~9
			for(int j = 0; j < 13;j++){		//j为前一位余数 
				for(int k = 0; k < 10;k++){		//因为'?'可以是0~9 
					dp[i][(j*10+k)%13] += dp[i-1][j];	//更新dp数组,第i位的除13余数为((j*10+k)%13)的数的个数,是前一位余数为j的数的个数相加(觉得解释不清,可看代码自行理解,道理不难)。 
					dp[i][(j*10+k)%13]%=MOD;//取模 
				} 
			}
		}
		else{
			for(int k = 0 ;k < 13; k++){
				dp[i][((s[i]-'0')+10*k)%13] += dp[i-1][k];//同上,只是该位数固定,不能为0~9 
				dp[i][((s[i]-'0')+10*k)%13]%=MOD;
			}
		}
	}
	cout<

 

 

你可能感兴趣的:(动态规划,Atcoder题解)