链接地址:https://atcoder.jp/contests/abc135/tasks/abc135_d
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : 400 points
Given is a string S. Each character in S is either a digit (0
, ..., 9
) or ?
.
Among the integers obtained by replacing each occurrence of ?
with a digit, how many have a remainder of 55 when divided by 13? An integer may begin with 0.
Since the answer can be enormous, print the count modulo 109+7109+7.
0
, ..., 9
) and ?
.Input is given from Standard Input in the following format:
S
Print the number of integers satisfying the condition, modulo 109+7.
??2??5
768
For example, 482305,002865,482305,002865, and 972665972665 satisfy the condition.
?44
1
Only 044044 satisfies the condition.
7?4
0
We may not be able to produce an integer satisfying the condition.
?6?42???8??2??06243????9??3???7258??5??7???????774????4?1??17???9?5?70???76???
153716888
给你一个由数字(0,9)和?组成的字符串,问你有几种情况该字符串模13余5,可以有前缀零,如果答案过大,则对1e9+7取模。
dp[100005][13],dp[i][j]表示到第i个字符为止,除以13余j(j表示的是到i-1为止模13余j)有多少中情况
若当前字符为数字,则递推公式dp[i][(j*10+s[i])%13] = (dp[i][(j*10+s[i])%13] + dp[i-1][j])%mod;
若当前字符为?,则递推公式dp[i][(j*10+k)%13] = (dp[i][(j*10+k)%13] + dp[i-1][j])%mod; (k从0到9,假设当前字符为k)
该过程就是模拟某个数模13余几的过程,比如:567%13 -> 5%13=5 , (5*10+6)%13=4 , (4*10+7)%13=8
以下代码为atcoder某位大佬(刷新下发现忘了是哪位大佬了)的代码
#include
using namespace std;
const int mod = 1e9+7;
char s[100005];
int dp[100005][13];
int main(){
scanf("%s", s+1);
int n = strlen(s+1);
dp[0][0] = 1;
for(int i=1;i<=n;i++){
if(s[i] != '?'){
s[i]-='0';
for(int j=0;j<13;j++){
dp[i][(j*10+s[i])%13] = (dp[i][(j*10+s[i])%13] + dp[i-1][j])%mod;
}
}
else{
for(int k=0;k<10;k++){
for(int j=0;j<13;j++){
dp[i][(j*10+k)%13] = (dp[i][(j*10+k)%13] + dp[i-1][j])%mod;
}
}
}
}
printf("%d\n", dp[n][5]);
}