Hdu 3652 && Scu 3774 B-number 数位dp

文章目录

题意

中文题我就不说了.

题解

标准数位dp.
我们用 d p [ i ] [ j ] [ 0 / 1 ] [ 0 / 1 ] dp[i][j][0/1][0/1] dp[i][j][0/1][0/1]表示当前数字的位数是 i i i位,当前数字模 13 13 13的余数是 j j j,是否已经出现过 13 13 13,最高位是否为 1 1 1的数字总数.
然后用普通的数位 d p dp dp即可通过此题.
谢谢大家.

#include<bits/stdc++.h> //Ithea Myse Valgulious
/*快读快写已被省略.*/
using namespace std;
int dp[20][25][2][2],bit[20],p;

int dfs(int now,int yu,int jd,int st,int lim){
/*当前位数,模13的余数,是否已经出现13,最高位是否为1,最高位是否有要求*/
if (!now) return !yu&&jd;
if (!lim&&~dp[now][yu][jd][st]) return dp[now][yu][jd][st];
int llx=0,i,da=lim?bit[now]:9;
for (i=0;i<=da;++i) llx+=dfs(now-1,(yu*10+i)%13,jd||st&&i==3,i==1,lim&&i==da);
return lim?llx:dp[now][yu][jd][st]=llx;
}

int solve(int n){
for (p=0;n;n/=10) bit[++p]=n%10;
return dfs(p,0,0,0,1);
}

int main(){
memset(dp,-1,sizeof dp);
for (int n;read(n);write(solve(n)),pl);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值