HDU3652 B-number

来源:互联网 发布:select标签默认选中js 编辑:程序博客网 时间:2024/05/17 02:18

数位dp

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;int bit[100];int dp[15][15][3];/*dp[i][j][k]i表示第几位,j表示余数为几,k等于0表示不存在13,k等于1表示末尾为1,k等于2表示存在1,3*/ int dfs(int p,int mod,int have,int lim){        //lim记录上限     int have_x,mod_x;    if(p<=0)                                return (have==2)&&(mod==0);    if(!lim&&dp[p][mod][have]!=-1)          //记忆化搜素         return dp[p][mod][have];    int num= lim?bit[p]: 9;                 //判断这个数最大为几     int ans=0;    for(int i=0;i<=num;i++){        int mod_x=(mod*10+i)%13;                    have_x=have;        if(have==0&&i==1)            have_x=1;        if(have==1&&i!=1)            have_x=0;        if(have==1&&i==3)            have_x=2;           ans+=dfs(p-1,mod_x,have_x,lim&&(i==num));    }    if(!lim)        dp[p][mod][have]=ans;    return ans;}int main(){    int n;    while(scanf("%d",&n)!=EOF){        mem1(dp);        mem0(bit);        int len=0;        while(n){            bit[++len]=n%10;            n/=10;        }        bit[len+1]=0;        cout<<dfs(len,0,0,1)<<endl;    }}
0 0
原创粉丝点击