小杂题

由于之前写的7月训练记录没保存,所以我决定不写了。

但是好孩子模拟赛的还是要写一下。

c班day1

Contest #1941 | Zhengrui Online Judge

T1

懒得喷 写了高精度 50 分遗憾离场。调我半个小时。

题意:给定 \(n\),小猫想知道所有 \(0≤i≤n\)\(2^i\) 的次高位开始最多有多少个连续的 \(0\)

做法:由样例可得连续的 \(0\) 的个数不会太多,因此用 double 维护科学计数法前面的数字即可,每次乘 \(2\),大于 \(10\) 就除 \(10\) (科学计数法),暴力统计 \(0\) 的个数。复杂度 \(O(n)\)

考虑到数 0 时用 double 取模很麻烦。所以我选择了用每次大于 \(10^{15}\) 再除 10.

int c[N];

int calc(int x){
    int cnt=0;
    while(x){
        c[++cnt]=x%10;
        x/=10;
    }
    cnt--;
    if(!cnt){
        return 0;
    }
    int res=0;
    while(c[cnt]==0&&cnt){
        res++;
        cnt--;
    }
    return res;
}

int mx[N],num[N];

void solve(){
    int n=read();
    write(mx[n]),spa,write(num[n]),ero;
}

signed main(){
    int res=1;
    for(int i=0;i<=N-10;i++){
        int tmp=calc(res);
        if(i!=0){
            mx[i]=mx[i-1];
            num[i]=num[i-1];
            if(tmp>=mx[i-1]){
                mx[i]=tmp;
                num[i]=i;
            }
        }
        if(i==0){
            mx[i]=tmp;
            num[i]=i;
        }
        res*=2ll;
        while(res>=mod){
            res/=10;
        }
    }
    int T=read();
    while(T--){
        solve();
    }
	return 0;
}
posted @ 2025-07-23 15:05  Slayer-WT!!!!!!!!  阅读(11)  评论(0)    收藏  举报