博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF 55D. Beautiful numbers(数位DP)
阅读量:4986 次
发布时间:2019-06-12

本文共 1503 字,大约阅读时间需要 5 分钟。

这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来。

1 #include 
2 #include
3 #include
4 using namespace std; 5 #define LL __int64 6 #define MOD 2520 7 LL dp[31][2600][50]; 8 int index[3000]; 9 int num[31];10 LL gcd(LL a,LL b)11 {12 return b == 0?a:gcd(b,a%b);13 }14 LL lcm(LL a,LL b)15 {16 return a*b/gcd(a,b);17 }18 LL dfs(int pos,int pre,int mod,int bound)19 {20 int end,tpre,tmod,i;21 LL ans = 0;22 if(pos == -1)23 return pre%mod == 0;24 if(!bound&&dp[pos][pre][index[mod]] != -1)25 return dp[pos][pre][index[mod]];26 end = bound ? num[pos] : 9;27 for(i = 0;i <= end;i ++)28 {29 tpre = (pre*10 + i)%MOD;30 if(i)31 tmod = lcm(mod,i);32 else33 tmod = mod;34 ans += dfs(pos-1,tpre,tmod,bound&&i == end);35 }36 if(!bound)37 dp[pos][pre][index[mod]] = ans;38 return ans;39 }40 LL judge(LL x)41 {42 int pos = 0;43 while(x)44 {45 num[pos++] = x%10;46 x = x/10;47 }48 return dfs(pos-1,0,1,1);49 }50 int main()51 {52 int t,i,num = 0;53 LL x,y;54 memset(dp,-1,sizeof(dp));55 for(i = 1;i <= MOD;i ++)56 {57 if(MOD%i == 0)58 index[i] = num++;59 }60 cin>>t;61 while(t--)62 {63 cin>>x>>y;64 printf("%I64d\n",judge(y)-judge(x-1));65 }66 return 0;67 }

 

转载于:https://www.cnblogs.com/naix-x/p/3330799.html

你可能感兴趣的文章
你了解栈溢出StackOverFloweExeption的原理吗?
查看>>
力扣(LeetCode)125. 验证回文串
查看>>
【转载】Eclipse快捷键
查看>>
RabbitMQ 集群
查看>>
关于docker
查看>>
Git的使用
查看>>
table表格设置边框线为单实线
查看>>
poj 2992 Divisors
查看>>
code review
查看>>
【摘录】Matrix学习——图像的复合变化
查看>>
RobotFramework自动化测试之脚本编写(一)
查看>>
学号 20175223 《Java程序设计》第10周学习总结
查看>>
解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2
查看>>
四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲
查看>>
Java文件IO操作应该抛弃File拥抱Paths和Files
查看>>
IO多路复用(一)-- Select、Poll、Epoll
查看>>
如何配置Filter过滤器处理JSP中文乱码(转)
查看>>
ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
查看>>
将Session放入Redis
查看>>
微信小程序图片使用示例
查看>>