lightoj 1068 - Investigation 数位DP
2016-03-29 09:09
435 查看
给定a,b,k,问[a,b]之间有多少个k的倍数并且各个位数的和也是k的倍数的数字。
因为a,b是int范围所以k>90肯定不成立。
接下来按照数位DP考虑肯定要考虑两个余数...,但是k这个数字取值的最小公倍数过于大,瞬间懵逼..
看了别人的才知道每次都初始化去做...仔细想想复杂度也不高...
因为a,b是int范围所以k>90肯定不成立。
接下来按照数位DP考虑肯定要考虑两个余数...,但是k这个数字取值的最小公倍数过于大,瞬间懵逼..
看了别人的才知道每次都初始化去做...仔细想想复杂度也不高...
#include<bits/stdc++.h> using namespace std; #define inf 0x7fffffff #define ll long long int num[20],k; int dp[20][100][100]; int dfs(int len,int y1,int y2,int f) { if(len==0) return y1==0&&y2==0; if(!f&&dp[len][y1][y2]!=-1) return dp[len][y1][y2]; int ans=0; int l=f?num[len]:9; for(int i=0;i<=l;i++) { int x1=(y1*10+i)%k; int x2=(y2+i)%k; ans+=dfs(len-1,x1,x2,f&&i==l); } if(!f) dp[len][y1][y2]=ans; return ans; } int solve(int x) { int i=1; while(x) { num[i++]=x%10; x=x/10; } return dfs(i-1,0,0,1); } int main() { int a,b; int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { scanf("%d %d %d",&a,&b,&k); printf("Case %d: ",cas); if(k>90) printf("0\n"); else { memset(dp,-1,sizeof(dp)); printf("%d\n",solve(b)-solve(a-1)); } } return 0; }
相关文章推荐
- p(343)通用汇点
- 高层论坛︱王家耀院士:“互联网+”时空大数据与智慧城市(3)
- 我的半年的大学生活
- java自定义filter
- 互联网+ 从IT到DT(读书笔记)
- Smobiler基于.NET框架开发移动应用内部系统—工作单功能(开发日志七)
- 360笔试--字符置换
- Android使用SharedPreferences保存对象
- Asp.Net Web API 2第九课——自承载Web API
- BZOJ 2461: [BeiJing2011]符环
- React下载网址
- ORACLE日期时间函数大全
- Eclipse Maven插件clean 异常
- localStorage 和 sessionStorage 的用法
- Asp.Net Web API 2第八课——Web API 2中的属性路由
- 互联网+时代创业黄金指南(读书笔记)
- USACO3.1 天梯-.-
- 高层论坛︱王家耀院士:“互联网+”时空大数据与智慧城市(2)
- 每天一个linux命令(32):gzip命令 【转】
- 编程基础知识分享——编程开始之前