A数组就是民间游戏”敲七”的序列
B数组就是{x∣∣xi∈{A}且i∉{A}}{x|xi∈{A}且i∉{A}}
然后输出B数组中第n个元素即:Bn
数位dp建立dp数组一般都是3位,一位表示当前数,一位表示前面的,一位表示状态。
前面就是%7 一共有7位,当前一共18位,状态有两个,一个是前面有7一个是没7。
然后记忆化搜索,就是数位dp
#include
using namespace std;
long long dp[20][8][2];
long long num[20];
long long dfs(int now,int mod,int limit,int status)
{
if(now<0)return mod%7==0||status;
if(dp[now][mod][status]!=-1&&!limit)return dp[now][mod][status];
int len=9;
if(limit)len=num[now];
long long ans=0;
for(int i=0; i<=len; i++)
{
ans+=dfs(now-1,(mod*10+i)%7,limit&&(i==num[now]),status||i==7);
}
if(!limit)dp[now][mod][status]=ans;
return ans;
}
long long cal(long long x)
{
int len=0;
while(x>0)num[len++]=x%10,x/=10;
return dfs(len-1,0,1,0)-1;
}
void solve(long long n)
{
long long l=7,r=1,mid,tmp;
r=r<<63;
r-=1;
while(l=n)
{
r=mid;
}
else
l=mid+1;
}
printf("%lld\n",l);
}
int main()
{
long long n;
memset(dp,-1,sizeof(dp));
while(~scanf("%lld",&n))
solve(n);
return 0;
}
n