题意:给定一个m,n,求出m以后第n个是7的倍数或者数字包含7的数。
这是刷数位DP时刷到的,有点懵一开始,这个怎么数位DP。。。思索了一下,弄了个比较曲线的做法:用数位DP夹逼。。。。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=10000007;
ll dp[15][7][2];
int digit[15];
ll dfs(int pos,int ori,int st,int limit)
{
if(pos==-1) return (!ori||st)? 1:0;
if(!limit&&dp[pos][ori][st]!=-1) return dp[pos][ori][st];
ll ret=0;
int up= limit? digit[pos]:9;
for(int i=0;i<=up;++i)
ret+=dfs(pos-1,(ori*10+i)%7,st||i==7,limit&&i==digit[pos]);
if(!limit) dp[pos][ori][st]=ret;
return ret;
}
ll solve(ll n)
{
int pos=0;
while(n) digit[pos++]=n%10, n/=10;
return dfs(--pos,0,0,1);
}
bool check(ll n)
{
if(n%7==0) return 1;
while(n)
{
if(n%10==7) return 1;
n/=10;
}
return 0;
}
int main()
{
ll m,n;
memset(dp,-1,sizeof(dp));
cin>>m>>n;
ll cnt=solve(m)+n;
ll k=m+n,temp=solve(m+n);
while(cnt!=temp)
{
if(temp<cnt) k+=cnt-temp;
else k-=(temp-cnt);
temp=solve(k);
}
while(!check(k)) k--;
cout<<k<<endl;
return 0;
}