明七暗七

1.試填法(莫名其妙爆空間)

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
 
ll tot , num[35] , f[35][9][9] , g[35] , m , n , ten[35];
 
ll dfs(int now , int seven , int mo , int maxl , int lead){
    if(now == 0){
        if((seven || !mo )&&(lead))return 1;   
        else return 0;
    }
    if(!maxl && lead && f[now][seven][mo])return f[now][seven][mo];
    ll num_maxl = (maxl ? num[now] : 9) , ans = 0;
    for(int i = 0 ; i <= num_maxl ; i++){
        ans = ans + dfs(now - 1 , seven | (i == 7) , (mo * 10 + i) % 7 , maxl & (i ==num_maxl) , lead | (i != 0));
    }
    if(!maxl && lead)f[now][seven][mo] = ans;
    return ans;
}
 
ll cal(ll now){//¼ÆËãnowÒÔÄÚµÄÄ¿±êÊý
    tot = 0;
    ll x = now , ans = 0;
    while(x)num[++tot] = x % 10 , x = x / 10;
    ans = dfs(tot , 0 , 0 , 1 , 0);
}
 
ll solve(ll x , ll y){//xλµÄµÚy¸ö
    int seven = 0;
    int mo = 0;
    int lead = 0;
    int cose;
    ll zz;
    for(int i = x ; i >= 0 ; i--){
        cose = 0;
        zz = dfs(i , seven | (cose == 7) , (mo * 10 + cose) % 7 , 0 , lead | (cose != 0));
        while(zz < y && y){
            y -= zz , cose++;
            zz = dfs(i , seven | (cose == 7) , (mo * 10 + cose) % 7 , 0 , lead | (cose != 0));
        }
        cout<<cose;
        seven = seven | (cose == 7);
        mo = (mo * 10 + cose) % 7;
        lead = lead | (cose != 0);
    }
}
 
int main(){
    memset(f , 0 , sizeof(f));
    ten[0] = 1;
    for(int i = 1 ; i <= 19 ; i++)ten[i] = ten[i - 1] * 10;
    for(int i = 1 ; i <= 13 ;  i++){
        g[i] = cal(ten[i] - 1);
    }
    while(scanf("%lld%lld" , &m , &n) == 2){
    //cin>>m>>n;
    n = n + cal(m);
    int now = 1;
    while(g[now + 1] < n)now++;
    solve(now , n);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章