首页 > 其他 > 详细

LightOJ 1068数位dp

时间:2014-02-07 22:32:01      阅读:500      评论:0      收藏:0      [点我收藏+]
Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu

[Submit]   [Go Back]   [Status]  

Description

An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is divisible by 3 and 12 (3+7+0+2) is also divisible by 3. This property also holds for the integer 9.

In this problem, we will investigate this property for other integers.

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case contains three positive integers A, B and K (1 ≤ A ≤ B < 231 and 0 < K < 10000).

Output

For each case, output the case number and the number of integers in the range [A, B] which are divisible by K and the sum of its digits is also divisible byK.

Sample Input

3

1 20 1

1 20 2

1 1000 4

Sample Output

Case 1: 20

Case 2: 5

Case 3: 64

Source

Problem Setter: Sohel Hafiz
Special Thanks: Jane Alam Jan (Solution, Dataset)


求A到B之间满足可以整除K且各位加起来整除K的数的个数。

由于最大才2^31,当K>90时,答案显然为0,然后就是简单数位dp

/* ***********************************************
Author :xianxingwuguan
Created Time :2014-2-7 16:17:23
File Name :1.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
int dp[15][110][110],num[15],K;
int dfs(int pos,int st,int mod,bool flag){
	if(pos==0)return mod==0&&st==0;
	if(flag&&dp[pos][st][mod]!=-1)return dp[pos][st][mod];
	int ans=0,u=flag?9:num[pos];
	for(int d=0;d<=u;d++)
		ans+=dfs(pos-1,(st*10+d)%K,(mod+d)%K,flag||d<u);
	if(flag)dp[pos][st][mod]=ans;
	return ans;
}
int solve(int x){
	memset(dp,-1,sizeof(dp));
	int len=0;
	while(x){
		num[++len]=x%10;
		x/=10;
	}
	return dfs(len,0,0,0);
}
int main()
{
     //freopen("data.in","r",stdin);
     //freopen("data.out","w",stdout);
     int T,A,B,t;
	 scanf("%d",&T);
	 for(t=1;t<=T;t++){
		 cin>>A>>B>>K;
		 printf("Case %d: ",t);
		 if(K>90)cout<<0<<endl;
		 else cout<<solve(B)-solve(A-1)<<endl;
	 }
     return 0;
}


LightOJ 1068数位dp

原文:http://blog.csdn.net/xianxingwuguan1/article/details/18965379

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!