11/29 的代码,萌新,什么也不懂:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll l, r;
ll tol, tor;
ll nums[22][22];
void init() {
for(ll i=2; i<=18; i++) {
for(ll j=1; j<=9; j++) {
nums[i][j]=1;
for(ll k=1; k<=i-1; k++) nums[i][j]*=j;
}
}
}
bool check(ll n) { // n 是否是 snake 数
ll m=to_string(n)[0]-'0';
while(n) {
if(n%10>=m && n>=10) return 0;
n/=10;
}
return 1;
}
ll calc(ll n) {
ll ret=0;
bool flag=check(n);
ll m=to_string(n)[0]-'0', l=to_string(n).length();
if(!flag) {
for(ll i=2; i<l; i++) {
for(ll j=1; j<=9; j++) ret+=nums[i][j];
}
for(ll j=1; j<=m; j++) ret+=nums[l][j];
}else {
for(ll i=2; i<l; i++) {
for(ll j=1; j<=9; j++) ret+=nums[i][j];
}
for(ll j=1; j<m; j++) ret+=nums[l][j];
ll a=n-pow(10, l-1)*m;
ll a_m=to_string(a)[0]-'0';
ret+=(m-1)*pow(m, l-2)+a-a_m*pow(10, l-2)+2;
}
return ret;
}
int main() {
init();
cin>>l>>r;
cout<<calc(r)-calc(l-1);
return 0;
}
为什么都在说 数位Dp 啊?