hdu P3652 与13相关的数【数位DP】

常规:

#include <cstdio>
const int Max=1e2+5;
int N,Len,Ans,Bit[Max],DP[Max][Max][3];
int DFS(int Pos,int Mod,int Have,int Lim){
    int I,J,K,Num,Ans,Mod_X,Have_X;
    if(Pos<=0){
        return Mod==0&&Have==2;
    }
    if(!Lim&&DP[Pos][Mod][Have]!=0){
        return DP[Pos][Mod][Have];
    }
    Num=Lim?Bit[Pos]:9;Ans=0;
    for(I=0;I<=Num;I++){
        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(Pos-1,Mod_X,Have_X,Lim&&I==Num);
    }
    if(!Lim){
        DP[Pos][Mod][Have]=Ans;
    }
    return Ans;
}
int main(){
    int I,J,K;
    scanf("%d",&N);
    while(N){
        Bit[++Len]=N%10;N/=10;
    }
    printf("%d",DFS(Len,0,0,1));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/82936138