题意:
计算1-n中能被13整除且包含13的数字的个数。
分析:
跟不要62差不多一个思路,不过多开一维表示余数;
这段时间一直在准备考试感觉水平倒退到了极点,这都调了一个多小时bug,QWQ,加油赶快恢复状态。
#include<bits/stdc++.h>
using namespace std;
int dp[15][15][3];
//dp[i][j][k] 表示第i位,余数是j,状态k( 能被13整除k=2,不能被13整除末尾数是1 k=1,不能被13整除末尾不是1 k=0 )
int bit[15];
int judge(int a,int b){
if(a==0){
if(b==1) return 1;
return 0;
}
if(a==1){
if(b==3) return 2;
if(b==1) return 1;
return 0;
}
return 2;
}
// 位数 余数 状态 是否为上界
int dfs(int len,int mod,int state,bool lim){
if(len==0) return state==2&&mod==0;//数字中出现13且被13整除
if(!lim&&dp[len][mod][state]!=-1) return dp[len][mod][state];//记忆化
//必须要加!lim的判断条件,否则可能会多算
int ans=0;
int up=lim?bit[len]:9;
for(int i=0;i<=up;i++){
ans+=dfs(len-1,(mod*10+i)%13,judge(state,i),lim&&i==bit[len]);
}
if(!lim) dp[len][mod][state]=ans;
return ans;
}
int solve(int n){
int len=0;
while(n){
bit[++len]=n%10;
n/=10;
}
return dfs(len,0,0,true);
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(dp,-1,sizeof dp);
printf("%d\n",solve(n));
}
return 0;
}