hdu3652 B-number

本文介绍一种算法,用于找出能被13整除且包含数字13的所有数。通过递归深度优先搜索实现,记录每一位数字的状态,并判断是否出现特定组合。

链接

题意求能够整除和包含13的数字。

这个比较简单,保留余数及1,然后标记前面是否出现过13就行。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 100000
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 LL n,dp[22][15][2][2];
18 int d[22];
19 LL dfs(int i,bool e,int r,bool o,bool p)
20 {
21     if(i==-1)
22     {
23         return r==0&&p;
24     }
25     if(!e&&dp[i][r][o][p]!=-1)
26     return dp[i][r][o][p];
27     int j;
28     int mk = e?d[i]:9;
29     LL ans = 0;
30     for(j = 0; j <= mk ; j++)
31     {
32         if(p)
33         ans+=dfs(i-1,e&&j==mk,(r*10+j)%13,0,1);
34         else
35         {
36             if(o&&j==3)
37             ans+=dfs(i-1,e&&j==mk,(r*10+j)%13,0,1);
38             else if(j==1)
39             ans+=dfs(i-1,e&&j==mk,(r*10+j)%13,1,0);
40             else
41             ans+=dfs(i-1,e&&j==mk,(r*10+j)%13,0,0);
42         }
43     }
44     return e?ans:dp[i][r][o][p]=ans;
45 }
46 LL cal(LL x)
47 {
48     int g=0;
49     while(x)
50     {
51         d[g++] = x%10;
52         x/=10;
53     }
54     return dfs(g-1,1,0,0,0);
55 }
56 int main()
57 {
58     memset(dp,-1,sizeof(dp));
59     while(cin>>n)
60     {
61         cout<<cal(n)<<endl;
62     }
63     return 0;
64 }
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3683003.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值