HDOJ3271_SNIBB
2016-05-20 19:29
267 查看
链接:HDOJ3271
题意:10进制的【A,B】区间内,在转化为BASE进制之后,各个数位的和为M的有多少个数,其中第K个数是多少
思路:转为为BASE进制和转为10进制有什么太大区别吗?
因为BASE不超过10,所以就是在模板的calc函数里改个值就好了
求数位的和为M就是模板
其中第二问:第K个数是多少有点麻烦
首先呢,第1个数是calc(X-1)这样来计算
最大的那个数是calc(Y)
然后就是经典二分搞定
题意:10进制的【A,B】区间内,在转化为BASE进制之后,各个数位的和为M的有多少个数,其中第K个数是多少
思路:转为为BASE进制和转为10进制有什么太大区别吗?
因为BASE不超过10,所以就是在模板的calc函数里改个值就好了
求数位的和为M就是模板
其中第二问:第K个数是多少有点麻烦
首先呢,第1个数是calc(X-1)这样来计算
最大的那个数是calc(Y)
然后就是经典二分搞定
#include<map> #include<set> #include<math.h> #include<time.h> #include<iostream> #include<cstdio> #include<queue> #include<stack> #include<stdio.h> #include<cstring> #include<string.h> #include<algorithm> #include<cstdlib> using namespace std; #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define ll rt<<1 #define rr rt<<1|1 #define LL long long #define ULL unsigned long long #define maxn 1050 #define maxnum 1000050 #define eps 1e-6 #define input freopen("input.txt","r",stdin) #define output freopen("output.txt","w",stdout) #define MOD 1000000007 int BASE,M; int digit[40]; int dp[40][500]; int dfs(int pos,int sum,bool flag){ if (pos==0) return sum==M; if (flag&&dp[pos][sum]!=-1) return dp[pos][sum]; int up=flag?BASE-1:digit[pos]; int ans=0; for(int i=0;i<=up;i++){ int temp=sum+i; if (temp>M) continue; ans+=dfs(pos-1,temp,flag||i<up); } if (flag) dp[pos][sum]=ans; return ans; } int calc(int num){ if (num<0) return 0; int len=0; while(num){ digit[++len]=num%BASE; num/=BASE; } return dfs(len,0,0); } int main(){ //input; int Q,X,Y,K,Case=0; while(scanf("%d",&Q)!=EOF){ printf("Case %d:\n",++Case); memset(dp,-1,sizeof(dp)); scanf("%d%d%d%d",&X,&Y,&BASE,&M); if (X>Y) swap(X,Y); if (Q==1) printf("%d\n",calc(Y)-calc(X-1)); else{ scanf("%d",&K); int l=X,r=Y+1; int limit=calc(X-1); while(l<r){ int m=l+(r-l)/2; if (calc(m)-limit<K) l=m+1; else r=m; } if (l==Y+1) printf("Could not find the Number!\n"); else printf("%d\n",l); } } return 0; }
相关文章推荐
- (++a)+=(a++)怎么计算啊?
- 《Linux及安全》实践2
- Linux中常见find命令的使用
- 小笔记
- 黎活明给程序员的忠告
- yii2框架-composer的自动加载
- 9260 USB无线网卡驱动移植
- 跟着官网学solr(一):solr环境的搭建
- 冒泡排序简易代码
- Android之Activity启动和结束方法-传递结果数据
- c语言中出现左操作数必须是左值(摘抄)
- 数据库开启调试模式的时候不能进行数据库字段缓存
- shell小记-检查一个目录是够为空
- QT中QPF字库的制作与旋转字体的实现
- scala学习14之scalatest中的intercept使用
- 结构体模版
- 【教她写代码】使用Intellij创建第一个Springboot程序
- MyTask4
- log4net面面观之工作原理
- HDU 1075 What Are You Talking About