给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数:
f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1
例如:
f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4
给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,即:
输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100)。
输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7。
对于样例 ,满足条件的数有 110 和 121,所以结果是 231 = 110 + 121。
更多样例:
Input |
4344 3214567 3 |
Output |
611668829 |
Input |
404491953 1587197241 1 |
Output |
323937411 |
Input |
60296763086567224 193422344885593844 10 |
Output |
608746132 |
Input |
100 121 -1 |
Output |
120 |
需要求<个数,和>
dp三维表示位数,当前数字的位数(出去前导0),交错和+200;
const ll mod=1000000007;
pair dp[20][20][400];
ll l,r,ten[20];
int bit[20],len,k;
inline pair dfs(int i,int s,bool zero,bool e,int sum){
if(i<0) return make_pair(sum==k,0);
if(!zero && !e && dp[i][s][sum+200].first!=-1) return dp[i][s][sum+200];
int v=(e?bit[i]:9);
pair ans,tmp;
ans=make_pair(0,0);
rep(j,0,v+1){
if(zero){
if(!j) tmp=dfs(i-1,0,1,e&&(j==v),0);
else tmp=dfs(i-1,1,0,e&&(j==v),j);
}
else{
tmp=dfs(i-1,s+1,0,e&&(j==v),sum+(s&1?-j:j));
}
ans.first=(ans.first+tmp.first)%mod;
ans.second=(ans.second+tmp.second+tmp.first*j*ten[i]%mod)%mod;
}
if(!e && !zero) dp[i][s][sum+200]=ans;
return ans;
}
inline ll solve(ll n){
if(n<=0) return 0;
len=0;
while(n){
bit[len++]=n%10;
n/=10;
}
return dfs(len-1,0,1,1,0).second;
}
int main(){
ten[0]=1;
rep(i,1,20) ten[i]=ten[i-1]*10%mod;
while(cin>>l>>r>>k){
rep(i,0,20) rep(j,0,20) rep(k,0,400) dp[i][j][k]=make_pair(-1,0);
cout<<(solve(r)-solve(l-1)+mod)%mod<