B-number
HDU 3652
题目大意:
有一个数n,求出1~n中含‘13’且能被13整除的数有多少个
输入样例
13
100
200
1000
输出样例
1
1
2
2
解题思路:
用数位DP枚举完每一位,同事也判断题目要求的条件
数据范围:
1 <= n <= 1000000000
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,tot,s[50],a[50][5][20];
int js(int dep,int tt,int number,bool yw)//dep表示第几位,tt表示是否有13,number表示除以13后的余数,yw代表是否到顶了
{int num,ans;if (dep<=0) return tt==2&&!number;if (!yw&&a[dep][tt][number]) return a[dep][tt][number];//记忆化num= yw?s[dep]:9;//到顶了就不能过大ans=0;for (int i=0;i<=num;++i)if (tt==1&&i==3||tt==2) ans+=js(dep-1,2,(number*10+i)%13,yw&&i==num);//有13的else if (i==1) ans+=js(dep-1,1,(number*10+i)%13,yw&&i==num);//有一个1,下一次加3即可else ans+=js(dep-1,0,(number*10+i)%13,yw&&i==num);//其他情况if (!yw) a[dep][tt][number]=ans;//记录return ans;
}
int main()
{while (~scanf("%d",&n)){memset(a,0,sizeof(a));memset(s,0,sizeof(s));tot=0;while (n) s[++tot]=n%10,n/=10;//二进制化printf("%d\n",js(tot,0,0,1));//输出}
}