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);
}
}