您的位置:首页 > 其它

【数位DP】HDU3652[B-number]题解

2017-11-03 20:33 405 查看

题目概述

求 [1,n] 中含有 13 且是 13 的倍数的数的个数。

解题报告

因为在复习,所以水博客就做了一下。

常用套路,定义 f[i][j][k] 表示放了 i 位余数( mod 13 )为 j 状态为 k 的方案数( 0 :没有 13 ; 1 :没有 13 ,目前高位是 1 ; 2 :有 13 ),然后直接记忆化DFS就行了。

示例程序

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10,MOD=13;

int n,a[maxn+5],f[maxn+5][MOD][3];

inline int getk(int k,int j) {if (k==2||k==1&&j==3) return 2;return j==1;}
int Solve(int i,int j,int k,bool fl)
{
if (!i) return !j&&k==2;if (!fl&&~f[i][j][k]) return f[i][j][k];
int MAX,ans=0;if (fl) MAX=a[i]; else MAX=9;
for (int t=0;t<=MAX;t++) ans+=Solve(i-1,(j*10+t)%13,getk(k,t),fl&&t==MAX);
if (!fl) f[i][j][k]=ans;return ans;
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
memset(f,255,sizeof(f));
while (~scanf("%d",&n))
{
a[0]=0;do a[++a[0]]=n%10,n/=10; while (n);
printf("%d\n",Solve(a[0],0,0,true));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: