uva 11361 dp
2016-02-20 16:32
288 查看
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long f[12][101][101]; long long pow[15],num[15]; long long a,b,p; long long dfs(int l,int k1,int k2,int e) { if(l==-1) return (k1==0)&&(k2==0); if(!e && f[l][k1][k2]!=-1)return f[l][k1][k2]; int u=(e?num[l]:9); long long res=0; for(int i=0;i<=u;i++) res+=dfs(l-1,(pow[l]*i+k1)%p,(i+k2)%p,e&&i==u); return e?res:f[l][k1][k2]=res; } long long solve(long long x) { int l=0; memset(f,-1,sizeof(f)); while(x!=0) { num[l++]=x%10; x=x/10; } return dfs(l-1,0,0,1); } int main() { int sec; scanf("%d",&sec); { long long x=1; for(int i=0;i<=10;i++) { pow[i]=x; x=x*10; } } while(sec--) { scanf("%lld%lld%lld",&a,&b,&p); if(p>=100)printf("0\n");else { long long ans=solve(b)-solve(a-1); printf("%lld\n",ans); } } return 0; }然后按照书上的思想我们设f【x】表示不超过x的非负整数中满足条件的个数,所以我们得到的答案就是f【b】-f【a-1】这一条不用多说。关键就在于怎么算f
书上在给出递推式子:f【d】【m1】【m2】表示d个数字,其中各数字之和除以k的余数为m1,这些数字组成的整数除以k的余数为m2的整数个数。这句话读起来可能比较绕口。可以这么想: 计算的时候表示递推的左起第d位时候,各位数字和%k=m1,该数字本身%k=m2 其中的值代表数字中小于给出的b或者a-1的个数一共多少个(貌似还是很绕口,但是希望能明白一点点)。接下来就是怎么求了:
由于要枚举最高位的数字0-9所以我们可以事先打表做好各位数字是什么。对于各位数字和 与当前数字本身 我们可以用递推的思想:就是我从第一位开始算,那么我们的第二位数字和就是第一位数字和+第二位数字,第二位数字本身就是第一位数字本身*10+第二位数字。所以我们可以一步一步取位取上去。即书上给出的递推式:我不想打了。。见书114页最底下。
接下来我们要考虑边界条件:
对于a-1或者b,我们以b为例(因为后面每次打的时候就不用打a-1了):对于b的前i位与枚举的前i位相等,那么当第i+1位比b的第i+1位大时,那么势必就不存在这个数了。
如果新数i+1位比b的i+1位小那么我们就可以认为是新增加了一个数所以+1 即对于f【i+1】【m1】【m2】+1 如果(第i+1位<b【i+1】)
最后我们当然是返回值是什么:
即:f【10】【0】【0】的值啦。对于前面10位两者%k都为0的情况
转载来自:http://blog.csdn.net/luyuncheng/article/details/8498169
相关文章推荐
- Android 异步消息处理简单理解
- select下拉框之默认选中问题
- Oracle 集群心跳及其參数misscount/disktimeout/reboottime
- JavaScript 实现Map
- Android4.4 Uri获取图片及document理解
- (*(volatile unsigned int *))详解
- java分布式对象(RMI+部署使用RMI的程序)
- The Swift Programming Language学习笔记(三)——基本运算符
- noj 1079 111...
- 【Linux 基础篇】之网络、语言、级别等配置
- android.hardware.Camera类及其标准接口介绍
- iOS WebView JS 交互
- 【bzoj2654】tree MST+二分法
- android 65535解决方案
- (*(volatile unsigned int *))详解
- vs2010安装完vc助手之后字体变成斜体如何解决?
- 一起看代码来玩玩QT之05 Controls
- Android Studio实现代码混淆
- DC4C代码阅读(7)——DAG
- php中的curl使用入门教程和常见用法实例