题意:
解法:
显然数位dp.
定义状态为d[ len] [ pref] [ cnt] :
1. 剩余长度为len.
2. 上一位的奇偶性为pref.
3. pref连续的次数% 2 = cnt.
的方案数.
然后按常规方法数位dp一下就行了, 注意对前导零的处理.
code:
#include <bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm= 1e6 + 5 ;
int d[ 22 ] [ 2 ] [ 2 ] ;
int digit[ 22 ] ;
int dfs ( int len, int limit, int pre, int pref, int cnt) {
if ( ! len) return ! pre&& ( pref!= cnt) ;
if ( ! limit&& ! pre&& d[ len] [ pref] [ cnt] != - 1 ) return d[ len] [ pref] [ cnt] ;
int ans= 0 ;
int ma= ( limit? digit[ len] : 9 ) ;
for ( int i= 0 ; i<= ma; i++ ) {
int pref1= ( i% 2 ) ;
if ( ! pre&& i% 2 != pref) {
if ( pref== cnt) continue ;
}
int cnt1= ( i% 2 == pref? cnt^ 1 : 1 ) ;
if ( pre&& i== 0 ) cnt1= 0 ;
ans+ = dfs ( len- 1 , limit&& i== ma, pre&& i== 0 , pref1, cnt1) ;
}
if ( ! limit&& ! pre) d[ len] [ pref] [ cnt] = ans;
return ans;
}
int solve ( int x) {
int len= 0 ;
while ( x) {
digit[ ++ len] = x% 10 ;
x/ = 10 ;
}
return dfs ( len, 1 , 1 , 0 , 0 ) ;
}
signed main ( ) {
ios:: sync_with_stdio ( 0 ) ;
memset ( d, - 1 , sizeof d) ;
int T; cin>> T;
int cas= 1 ;
while ( T-- ) {
int l, r; cin>> l>> r;
int ans= solve ( r) - solve ( l- 1 ) ;
cout<< "Case " << "#" << cas++ << ": " << ans<< endl;
}
return 0 ;
}