C 题公式法求找错
  • 板块学术版
  • 楼主da_ke
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/4 21:46
  • 上次更新2025/1/5 10:20:43
查看原帖
C 题公式法求找错
766675
da_ke楼主2025/1/4 21:46

不妨区间化。先计算出 R\leq R 的最大蛇数 rr。记录这个数为 dN,dN1,,d2,d1d_N,d_{N-1},\cdots,d_2,d_1(这里是按从前往后数位顺序给出的),那么 r\leq r 的蛇数个数为 i=1N(di)i\sum\limits_{i=1}^{N}(d_i)^i

#include <bits/stdc++.h>

#define i64 long long
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define fdn(i,r,l) for(int i=(r);i>=(l);i--)
#define pii pair<int,int>
using namespace std;

typedef long long ll;
typedef double db;
typedef __int128 i128;

std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
std::mt19937_64 rnd64(std::chrono::steady_clock::now().time_since_epoch().count());

ll L,R;

ll slow_power(ll a,ll b)
{
    ll ans=1;
    rep(i,1,b) ans*=a;
    return ans;
}

ll solve(ll x)
{
    ll X=x;
    int len=0;
    vector<int> dig(25,0);
    while(X) dig[++len]=X%10,X/=10;
    fdn(i,len-1,1)
        if(dig[i]>=dig[len])
        {
            fdn(j,i,1) dig[j]=dig[len]-1;
            break;
        } 
    ll ans=0;
    fdn(i,len,1)
        ans+=slow_power(dig[i],i);
    return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    cin>>L>>R;
    cout<<solve(R)-solve(L-1);
}
2025/1/4 21:46
加载中...