C题求调
  • 板块题目总版
  • 楼主c_legg
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/1/4 21:57
  • 上次更新2025/1/5 11:19:18
查看原帖
C题求调
1054383
c_legg楼主2025/1/4 21:57

11/2911/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 啊?

2025/1/4 21:57
加载中...