rt,样例没过,观察到 sfd 一直返回 0。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int l, r;
int a[25];
int dp[20][2][20][20];
int slen;
int dfs(int len, bool st, bool flag, int num, int lnum)
{
if(len == -1)
{
if(lnum >= (slen / 2)) return 1;
return 0;
}
if(st && ~dp[len][flag][num][lnum]) return dp[len][flag][num][lnum];
int up = !flag ? a[len] : 9;
int ans = 0;
for(int i = 0; i <= up; i++)
{
if(i == 0 && st)
{
ans += dfs(len - 1, 1, (flag || i < up), num, lnum + (i == num));
}
else
{
ans += dfs(len - 1, 0, (flag || i < up), num, lnum + (i == num));
}
}
if(st) dp[len][flag][num][lnum] = ans;
return ans;
}
int f[15][2][15][15];
int sfd(int len, bool st, bool flag, int a1, int a2, int num1, int num2)
{
if(len == -1)
{
if(a1 == a2 && num1 + num2 == slen) return 1;
return 0;
}
if(st && ~f[len][flag][num1][num2]) return f[len][flag][num1][num2];
int up = !flag ? a[len] : 9;
int ans = 0;
if(st)
ans += sfd(len - 1, 0, flag, a1, a2, num1, num2);
if(a1 <= up && (!st || a1))
ans += sfd(len - 1, 1, (flag || a1 < up), a1, a2, num1 + 1, num2);
if(a2 <= up && (!st || a2))
ans += sfd(len - 1, 1, (flag || a2 < up), a1, a2, num1, num2 + 1);
if(st) f[len][flag][num1][num2] = ans;
return ans;
}
int calc(int x)
{
int len = 0;
while(x)
{
a[len++] = x % 10;
x /= 10;
}
len--;
int ans = 0;
slen = len;
for(int i = 0; i <= 9; i++)
{
memset(dp, -1, sizeof dp);
ans += dfs(len, 1, 0, i, 0);
}
int oth = 0;
for(int i = 1; i <= 9; i++)
{
for(int j = 0; j < i; j++)
{
memset(f, -1, sizeof f);
oth += sfd(len, 1, 0, i, j, 0, 0);
}
}
// cout << ans << " " << oth << endl;
return ans - oth;
}
signed main()
{
cin >> l >> r;
printf("%lld\n", calc(r) - calc(l - 1));
return 0;
}