求大佬帮忙!样例全过了,AC了一个点
查看原帖
求大佬帮忙!样例全过了,AC了一个点
554231
Jayling楼主2025/6/25 19:14
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 1145141923;
int q;
const int MAXN = 1e7+10;
int dp[MAXN];
int dpmin[700];//表示前1-i里里面小于i的下
int sum[MAXN];
int qpow(int a,int n){
    int res=1;
    while(n>0){
        if(n&1){
            res = res*a%MOD;
        }
        a = a*a%MOD;
        n>>=1;
    }
    return res;
}
int dfs(int n){
    if(n==1){
        return 0;
    }
    if(n<MAXN && dp[n]!=-1){
        return dp[n];
    }
    int res;
    if(n%2==0){
        res = dfs(n/2)+1;
    }else{
        res = dfs(3*n+1)+1;
    }
    if(n<MAXN){
        dp[n]=res;
    }
    return res;
}
inline void run(){
    cin>>q;
    memset(dp,-1,sizeof(dp));
    for(int i=0;i<=700;i++){
        dpmin[i]=INT_MAX;
    }
    for(int i=1;i<=1e7;i++){
        dfs(i);
    }
    for(int i=1;i<MAXN;i++){
        int val = dp[i];
        if(val<700) dpmin[val]=min(dpmin[val],i);
    }
    for(int i=698;i>=0;i--){
        dpmin[i]=min(dpmin[i],dpmin[i+1]);
    }
    sum[0]=1;
    sum[1]=1;
    for(int i=2;i<=1e7;i++){
        sum[i]=sum[i-1]*dp[i]%MOD;
    }
    while(q--){
        int op;
        cin>>op;
        if(op==1){
            int x;
            cin>>x;
            cout<<dpmin[x]<<'\n';
        }else{
            int l,r;
            cin>>l>>r;
            cout<<(sum[r]%MOD*qpow(sum[l-1],MOD-2))%MOD<<'\n';
        }
    }
    return ;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    // freopen("test.in","r",stdin);
    int T=1;
    while(T--){
        run();
    }

    return 0;
}
2025/6/25 19:14
加载中...