hdu5787(数位dp)

时间:2023-03-09 21:10:13
hdu5787(数位dp)

基础的数位dp,才发现今天才终于彻底搞懂了数位dp。。。

//
// main.cpp
// hdu5787.1
//
// Created by New_Life on 16/8/10.
// Copyright © 2016年 chenhuan001. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std; long long dp[][][];
int k;
int mod; long long dfs(int wei[],int p,int flag,long long pre,int pk)
{
if(p<) return ;
if(flag == && dp[p][pk][pre]!= -) return dp[p][pk][pre];
int mark[];
int twei[];
memset(mark,,sizeof(mark));
memset(twei,,sizeof(twei));
long long tp = pre;
int cnt = ;
while(tp)
{
twei[ cnt++ ] = tp%;
tp/=;
}
for(int i=;i<pk;i++) mark[twei[i]]++; if(flag == )
{
long long sum = ;
for(int i=;i<wei[p];i++)
{
if(pk== && i==)
{
sum += dfs(wei,p-,,,);
}
else
{
if(mark[i]==)
sum += dfs(wei,p-,,(pre*+i)%mod,min(pk+,k-));
}
}
if(mark[wei[p]]==) sum += dfs(wei,p-,,(pre*+wei[p])%mod,min(pk+,k-));
return sum;
}
else
{
long long sum = ;
for(int i=;i<=;i++)
{
if(pk== && i==)
{
sum += dfs(wei,p-,,,);
}
else
{
if(mark[i]==)
{
sum += dfs( wei,p-,,(pre*+i)%mod,min(pk+,k-) );
}
}
}
return dp[p][pk][pre]=sum;
}
} long long get(long long x)
{
if(x==) return ;
memset(dp,-,sizeof(dp));
int wei[];
int cnt = ;
while(x)
{
wei[cnt++] = x%;
x /= ;
}
return dfs(wei,cnt-,,,);
} int main(int argc, const char * argv[]) {
long long L,R;
while (cin>>L>>R>>k) {
mod = (int)pow(10.0,k-);
cout<<get(R)-get(L-)<<endl;
// int ans = 0;
// for(int i=L;i<=R;i++)
// {
// int wei[10];
// memset(wei, 0, sizeof(wei));
// int ti = i;
// int cnt = 0;
// while(ti)
// {
// wei[ cnt++ ] = ti%10;
// ti/=10;
// }
// int flag = 0;
// for(int j=1;j<cnt;j++)
// {
// for(int p=1;p<k;p++)
// {
// if(j-p>=0 && wei[j-p]==wei[j] )
// {
// flag = 1;
// break;
// }
// }
// if(flag) break;
// }
// if(flag == 0) ans++;
// }
// printf("right: %d\n",ans);
}
return ;
}
/*
1 1 2
20 100 5
101 101 3
100 200 2
*/