[数位dp] hdu 3652 B-number

来源:互联网 发布:java如何调用存储过程 编辑:程序博客网 时间:2024/05/22 18:21

题意:求含有13且能被13整除的数有多少个

思路:dp[i][j][k]  i位,余数j,结果k   k=0代表没有1也没有3,k=1代表前一位是1,k=2代表这之前已经含有13了

代码:

#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"#define eps 1e-8using namespace std;int dp[12][15][3],num[12],ten[12];int dfs(int site,int mod,int ok,int f){    if(site==0)    {        if(mod==0&&ok==2) return 1;        return 0;    }    if(!f&&dp[site][mod][ok]!=-1) return dp[site][mod][ok];    int len=f?num[site]:9;    int ans=0;    for(int i=0;i<=len;i++)    {        int tep=((i*ten[site])+mod)%13;        if(ok==2) ans+=dfs(site-1,tep,2,f&&i==len);        else        {            if(i==1) ans+=dfs(site-1,tep,1,f&&i==len);            else if(i==3&&ok==1) ans+=dfs(site-1,tep,2,f&&i==len);            else ans+=dfs(site-1,tep,0,f&&i==len);        }    }    if(!f) dp[site][mod][ok]=ans;    return ans;}int solve(int x){    int cnt=0;    while(x)    {        num[++cnt]=x%10;        x/=10;    }    return dfs(cnt,0,0,1);}int main(){    int n;    memset(dp,-1,sizeof(dp));    ten[1]=1;    for(int i=2;i<=10;i++) ten[i]=ten[i-1]*10;    while(scanf("%d",&n)!=-1)    {        printf("%d\n",solve(n));    }    return 0;}


0 0
原创粉丝点击