hdu 3943 统计出现了x次4与y次7的数字
2013-05-09 19:37
162 查看
统计n以下所有有x次4和y次7的数的个数,然后二分。
View Code
View Code
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; typedef long long LL; int const N = 22; int const M = 22; LL dp ; int bit ,ln; int x,y; LL getsum1(int t,int limit,int cnt4,int cnt7) { if(cnt4>x||cnt7>y)return 0; if(!t)return (x==cnt4&&y==cnt7); int up=(limit?bit[t]:9); if(!limit&&dp[t][cnt4][cnt7]!=-1)return dp[t][cnt4][cnt7]; LL ans=0; for(int i=0;i<=up;i++) { ans+=getsum1(t-1,limit&&i==up,cnt4+(i==4),cnt7+(i==7)); } if(!limit)dp[t][cnt4][cnt7]=ans; return ans; } LL getsum2(LL n) { for(ln=0;n;bit[++ln]=n%10,n/=10); return getsum1(ln,1,0,0); } int main() { LL P,Q; int T,t=0,n; scanf("%d",&T); while(T--) { memset(dp,-1,sizeof(dp)); scanf("%I64d %I64d",&P,&Q); scanf("%d %d",&x,&y); LL l,r,mid,k,ans; scanf("%d",&n); printf("Case #%d:\n",++t); LL sign=getsum2(P); LL up=getsum2(Q)-sign; for(int i=0;i<n;i++) { scanf("%I64d",&k); if(k>up){printf("Nya!\n");continue;} l=P+1,r=Q; while(l<r) { mid=(l+r)>>1; LL cnt=getsum2(mid); cnt-sign>=k?(r=mid):(l=mid+1); } printf("%I64d\n",l); } } return 0; }
相关文章推荐
- HDU_2017——统计数字字符出现的个数
- 统计你的手机号码中出现次数最多的数字,并打印出此数字及其出现次数
- 统计各个数字、空白符、及所有其他字符出现的次数
- 【C语言】统计随机数中数字出现个数,并打印直方图
- 在命令行任意输入一组数字(0~9),然后统计这组数据中每个数字出现的个数,然后将统计个数逆序输出
- 统计字符在字符串中或者数字在数字数组中出现的频率
- 【c语言】统计一个数字在排序数组中出现的次数
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 统计一个数字在排序数组中出现的次数
- go语言之map练习之(一):统计字母、数字等Unicode中不同的字符类别出现的次数
- 《牛客网剑指offer37题》统计一个数字在排序数组中出现的次数
- 统计出现最多的数字
- 统计数字出现个数
- 统计用户输入的一串数字中每个数字出现的次数
- 统计一个数字在排序数组中出现的次数
- hdu 2095 find your present (2) 找到只出现一次的数字
- noip2010 数字统计 (统计某一数字区间中,2出现的次数)
- 华为机试 - 统计出现最多次数的数字
- 统计一个数字在排序数组中出现的次数(二分法)
- 8.统计数组中数字出现次数