社区讨论

萌新求问

P12087[RMI 2019] 好数 / Lucky Numbers参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mlq78ovx
此快照首次捕获于
2026/02/17 14:05
前天
此快照最后确认于
2026/02/18 11:44
昨天
查看原帖
如图
TLECPP
#include <bits/stdc++.h>
using namespace std;
void Ios(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define fir first
#define sec second
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ll long long
#define int long long
const int maxn=1e5+10;
const int mod=1e9+7;
int num[maxn];
int dp[maxn][2];
int dfs(int pos,bool is1,bool lim,bool zer)
{
    if(pos==0) return 1;
    if(!lim&&!zer&&dp[pos][is1]!=-1) return dp[pos][is1];
    int cnt=0;
    REP(i,zer,(lim?num[pos]:9))
    if(is1&&i==3);
    else
    {
        cnt+=dfs(pos-1,(i==1),(lim&&i==num[pos]),0);
        cnt%=mod;
    }
    if(!lim&&!zer) dp[pos][is1]=cnt;
    return cnt;
}
string x;
void solve(int l,int r)
{
    while(x[l]=='0') l++;
    int tot=0;
    for(int i=r;i>=l;i--) num[++tot]=x[i]-'0';
    int ans=dfs(tot,0,1,1);
    REP(i,1,tot-1) ans+=dfs(i,0,0,1),ans%=mod;
    cout<<ans+1<<"\n";
}
signed main()
{
    Ios();
    memset(dp,-1,sizeof dp);
    int n,q;
    cin>>n>>q>>x;
    x=" "+x;
    solve(1,n);
    while(q--)
    {
        int opt;
        cin>>opt;
        if(opt==1)
        {
            int l,r;
            cin>>l>>r;
            solve(l,r);
        }
        else
        {
            int p,v;
            cin>>p>>v;
            x[p]=v+'0';
        }
    }
}
ACCPP
#include <bits/stdc++.h>
using namespace std;
void Ios(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define fir first
#define sec second
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ll long long
#define int long long
const int maxn=1e5+10;
const int mod=1e9+7;
int num[maxn];
int dp[maxn][2];
int dfs(int pos,bool is1,bool lim)
{
    if(pos==0) return 1;
    if(!lim&&dp[pos][is1]!=-1) return dp[pos][is1];
    int cnt=0;
    REP(i,0,(lim?num[pos]:9))
    if(is1&&i==3);
    else
    {
        cnt+=dfs(pos-1,(i==1),(lim&&i==num[pos]));
        cnt%=mod;
    }
    if(!lim) dp[pos][is1]=cnt;
    return cnt;
}
string x;
void solve(int l,int r)
{
    while(x[l]=='0') l++;
    int tot=0;
    for(int i=r;i>=l;i--) num[++tot]=x[i]-'0';
    int ans=dfs(tot,0,1);
    cout<<ans<<"\n";
}
signed main()
{
    Ios();
    memset(dp,-1,sizeof dp);
    int n,q;
    cin>>n>>q>>x;
    x=" "+x;
    solve(1,n);
    while(q--)
    {
        int opt;
        cin>>opt;
        if(opt==1)
        {
            int l,r;
            cin>>l>>r;
            solve(l,r);
        }
        else
        {
            int p,v;
            cin>>p>>v;
            x[p]=v+'0';
        }
    }
}
为啥把前导零的判断去了就会快很多

回复

3 条回复,欢迎继续交流。

正在加载回复...