站外题RE求助
  • 板块学术版
  • 楼主Genshin_Morax
  • 当前回复1
  • 已保存回复2
  • 发布时间2025/1/28 16:42
  • 上次更新2025/1/29 00:00:31
查看原帖
站外题RE求助
749194
Genshin_Morax楼主2025/1/28 16:42

样例全过,但是RE(不知道多少分也不知道那些点AC因为OJ不显示),求调

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PLL;
const int N=20;
const int mod=998244353;
ll l,r;
int k;
int a[N+5];
PLL dp[N+5][1<<11];
ll p[N+5];
int count(int x)
{
    int cnt=0;
    for(int i=x;i>0;i-=lowbit(i)) cnt++;
    return cnt;
}
PLL dfs(int step,bool flag,int mask)
{
    if(step==0) return {0,1};
    if(!flag&&dp[step][mask].first!=-1) return dp[step][mask];
    int maxx=flag?a[step]:9;
    ll ret=0,cnt=0;
    for(int i=0;i<=maxx;i++)
    {
        if(count(mask|(1<<i))>k) continue;
        if(mask==0&&i==0)
        {
            PLL res=dfs(step-1,flag&&(i==maxx),0);
            ret=(ret+res.first)%mod;
            cnt=(cnt+res.second)%mod;
        }
        else
        {
            PLL res=dfs(step-1,flag&&(i==maxx),mask|(1<<i));
            ret=(1ll*i*p[step]%mod*res.second+res.first+ret)%mod;
            cnt=(cnt+res.second)%mod;
        }
    }
    if(!flag) dp[step][mask]={ret,cnt};
    //cout<<step<<" "<<flag<<" "<<mask<<" "<<ret<<" "<<cnt<<"\n";
    return {ret,cnt};
}
void init()
{
    ll k=1;
    for(int i=1;i<=18;i++) p[i]=k%mod,k*=10;
}
ll solve(ll x)
{
    ll k=x;
    memset(a,0,sizeof(a));
    for(int i=18;i>=1;i--)
    {
        a[i]=k/p[i];
        k%=p[i];
    }
    for(int i=0;i<=24;i++)
    {
        for(int j=0;j<(1<<11);j++)
        {
            dp[i][j]={-1,-1};
        }
    }
    return (dfs(19,1,0).first+mod)%mod;
}
signed main()
{
    init();
    cin>>l>>r>>k;
    cout<<(solve(r)-solve(l-1)+mod)%mod<<"\n";
	return 0;
}
2025/1/28 16:42
加载中...