• POJ3208 Apocalypse Someday(二分 数位DP)


    数位DP加二分

    //数位dp,dfs记忆化搜索
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long LL;
    #define N 20
    
    LL dp[N][3];//dp[i][j]表示长度为i,前面有j个6时不含666的数的个数
    int num[N];
    
    //c6表示前面6的个数
    LL dfs(int len, int c6, bool ismax){
    	if(len == 0){
    		return 1;
    	}
    	if(!ismax && dp[len][c6] >= 0){
    		return dp[len][c6];
    	}
    	int max = ismax? num[len]:9;
    	LL cnt = 0;
    	for(int i = 0; i <= max; i++){
    		if(c6 == 2 && i == 6){
    			continue;
    		}
    		cnt += dfs(len-1, i == 6? c6 + 1: 0, ismax && i == max);
    	}
    	return ismax?cnt:dp[len][c6]=cnt;
    }
    
    LL solve(LL n){
    	LL t = n;
    	int len = 0;
    	while(n){
    		num[++len]=n%10;
    		n/=10;
    	}
    	return t + 1 - dfs(len, 0, true);
    }
    
    
    int main(){
        memset(dp,-1,sizeof(dp));
        int t;
        cin>>t;
        while(t--){
        	LL n;
        	scanf("%I64d", &n);
        	LL l = 666, r = 50000000666ll;
        	while(l < r){
        		LL m = (l + r)>>1;
        		if(solve(m) < n){
        			l = m + 1;
        		}else{
        			r = m;
        		}
        	}
        	printf("%I64d
    ", l);
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    毕业论文格式
    2018.12.14
    关于百度搜索引擎的优缺点
    2018.12.13
    2018.12.12
    2018.12.11
    2108.12.10
    2018.12.9
    2018.12.8
    2018.12.7
  • 原文地址:https://www.cnblogs.com/IMGavin/p/5808150.html
Copyright © 2020-2023  润新知