題目鏈接 : HDU-3709
to calculate the number of balanced numbers in a given range [x, y].
2 0 9 7604 24324Sample Output
10 897題意:計算從l到r有多少個平衡數。即從該數的某一位分開,兩邊的權值相等。
題解:記錄的時候注意記錄兩邊的權值差值~不然數組會炸掉~
#include<stdio.h>
#include<iostream>
#include<set>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
ll dp[20][20][3600];
int digt[20];
ll dfs(int pos , int mid , int sub , bool limit) {
if(pos < 0)
return sub == 0;
if(!limit && dp[pos][mid][sub] != -1)
return dp[pos][mid][sub];
int prepos = limit ? digt[pos] : 9;
ll ans =0 ;
for(int i = 0 ; i <= prepos ; i ++) {
ans += dfs(pos - 1 , mid , sub + (pos - mid)*i , limit&&i == prepos);
}
if(!limit)
dp[pos][mid][sub] = ans;
return ans;
}
ll solve(ll x) {
memset(digt , 0 , sizeof(digt));
int k = 0 ;
while(x) {
digt[k++] = x % 10;
x /= 10;
}
ll ans = 0 ;
for(int i = 0 ; i < k ; i ++) {
ans += dfs(k - 1 , i , 0 , 1);
}
return ans - k;
}
int main()
{
//freopen("in.txt" , "r", stdin);
ll l , r ;
int t ;
memset(dp , -1 , sizeof(dp));
scanf("%d" , &t);
while(t--) {
scanf("%lld %lld" , &l , &r) ;
printf("%lld\n" , solve(r) - solve(l - 1));
}
return 0;
}