小杂题
由于之前写的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;
}

浙公网安备 33010602011771号