topcoder: TCHS10 Championship Round DIV 1 (lucky number third level)

来源:互联网 发布:高颜值 知乎 编辑:程序博客网 时间:2024/06/05 02:49

Problem Statement

 

The digits 4 and 7 are lucky digits, and all other digits are unlucky. A third level lucky number is a positive integer that is divisible by at least one lucky digit. John and Brus have written down all the third level lucky numbers betweena and b, inclusive, and now they would like to count the number of occurrences of each digit between 0 and 9, inclusive, in the numbers they have written.

Return a vector<long long> containing exactly 10 elements, where the i-th element (0-based) is the total number of occurrences of digit i.

Definition

 Class:TheLuckyNumbersLevelThreeMethod:findParameters:long long, long longReturns:vector<long long>Method signature:vector<long long> find(long long a, long long b)(be sure your method is public)

Limits

 Time limit (s):2.000Memory limit (MB):64

Constraints

-a will be between 1 and 10^16, inclusive.-b will be between a and 10^16, inclusive.

数位dp的题居然也能压轴~~服了。

题意:列出区间[a,b]所有能被4或者7整除的数,统计这些数含有多少个digit s,s:0,1,...,9

example:

a = 1, b = 10

Returns: {0, 0, 0, 0, 1, 0, 0, 1, 1, 0 }
There are three third level lucky numbers in this range - 4, 7, 8.

tricky: 传统的数位dp一般数统计满足条件的数的个数,但是这个题统计的是满足条件的数中digit 0-9的个数。

一开始,如果不仔细分析到这里就很容易跳进死胡同,其实此题可以很简单的转换到常规数位dp

换一种问法:区间[a,b]中所有满足条件的数x:

x能被4或者7整除的

x含有k个1

这里就可以枚举 k 和digit 0-9。

然后,设计数位dp的递归函数就比较方便了。


#include<cmath>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<vector>using namespace std;#define FOR(i,a,b) for(int i=a;i<b;i++)#define FORE(i,a,b) for(int i=a;i<=b;i++)#define MST(a,b) memset(a,b,sizeof(a))class TheLuckyNumbersLevelThree{public:int cur,n;int d[17];int tmpsum;long long dp[17][17][7][4];int mod4[17],mod7[17];TheLuckyNumbersLevelThree(){mod4[0] = mod7[0] = 1;FOR(i,1,17) mod4[i] = mod4[i-1]*10%4;FOR(i,1,17) mod7[i] = mod7[i-1]*10%7;tmpsum = 0;}long long dfs(int i,int c,int u,int v,bool flag) {if(i==-1){if(!u || !v)return c;else return 0;}if(!flag && tmpsum && dp[i][c][u][v]!=-1 )return  dp[i][c][u][v];long long ans = 0;int lim = (flag?d[i]:9);FORE(s,0,lim){tmpsum += s;ans += dfs(i-1,c+((s==cur) && tmpsum),(u+s*mod7[i])%7,(v+s*mod4[i])%4,flag && (s==lim));tmpsum -= s;}if(!flag && tmpsum) dp[i][c][u][v] = ans;return ans;}vector<long long> find(long long a, long long b){long long sa,sb,x;vector<long long>  ans;FOR(i,0,10){cur = i;for(x = a-1,n = 0;x;x/=10)d[n++]=x%10;MST(dp,-1);sa = dfs(n-1,0,0,0,1);for(x = b,n = 0;x;x/=10)d[n++]=x%10;MST(dp,-1);sb = dfs(n-1,0,0,0,1);ans.push_back(sb-sa);}return ans;}};






0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴唇上长很多泡怎么办 嘴巴里长白色泡怎么办 做了漂唇起泡了怎么办 漂唇之后起泡了怎么办 漂唇后起了水泡怎么办 嘴唇起泡,弄破了怎么办 九个月的宝宝上火了怎么办 8岁儿童嘴唇起泡怎么办 宝宝嘴皮上火起泡了怎么办 上嘴唇起泡肿了怎么办 上嘴唇突然肿了怎么办? 醒来上嘴唇肿了怎么办 嘴巴突然肿了怎么办呢 下嘴唇肿起来了怎么办 上嘴唇肿了起泡怎么办 上火下嘴唇肿了怎么办 上火嘴唇都肿了怎么办 嘴唇起泡后肿了怎么办 嘴唇上有白点颗粒状怎么办 嘴唇缺了一块红怎么办 人得钩端螺旋体怎么办 脖子上有鸡皮肤怎么办 不结婚老了以后怎么办 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办 身上起小包很痒怎么办 浑身起红包很痒怎么办 手太粗糙怎么办小窍门 小腿长疙瘩很痒怎么办 腿过敏起红疙瘩怎么办 肚子上起红疙瘩很痒怎么办 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办 泰迪身上长白毛怎么办 鱼身上有红斑了怎么办