hdu 3652 数位dp

来源:互联网 发布:mac搜狗五笔不能打字 编辑:程序博客网 时间:2024/05/14 18:21

直接套的模板

#include<bitset>#include<map>#include<vector>#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<stack>#include<queue>#include<set>#define inf 0x3f3f3f3f#define mem(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;typedef pair<int,int> pii;inline int in(){    int res=0;char c;    while((c=getchar())<'0' || c>'9');    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();    return res;}const int N=100010;int bit[20];int dp[22][22][3];int dfs(int pos,int mod,int lim,int flag){    if(pos==0) return mod==0 && flag==2;    if(!lim && dp[pos][mod][flag]!=-1) return dp[pos][mod][flag];    int mx=lim? bit[pos] : 9;    int cnt=0;    for(int i=0;i<=mx;i++)    {        int t=flag;        if(flag==1 && i==3) flag=2;        else if(flag==1 && i!=1) flag=0;        else if(flag==0 && i==1) flag=1;        int tmp=(mod*10+i)%13;        cnt += dfs(pos-1,tmp,lim && i==mx,flag);        flag=t;    }    if(!lim) return dp[pos][mod][flag]=cnt;    return cnt;}int solve(int n){    mem(bit,0);    mem(dp,-1);    int tmp=n;    int cnt=1;    while(tmp)    {        bit[cnt++]=tmp%10;        tmp/=10;    }    return dfs(cnt-1,0,1,0);}int main(){    int n;    while(~scanf("%d",&n))    {        printf("%d\n",solve(n));    }    return 0;}


0 0