题解审核反馈:“很遗憾,您上传的题解 AT_arc127_a [ARC127A] Leading 1s 题解 未能通过审核。原因是 【中文】与【英文、数字或公式】之间应以半角空格隔开; 。”
求大佬们帮助。
以下为题解源码(因为有代码片段,所以下面题解的源码分成 3 部分):
# 洛谷 AT_arc127_a 题解
## 题目大意
当用十进制表示整数 $x$ 时,最高位开始连续的1的个数用 $f[x]$ 表示。
给出了整数 $n$,求 $\sum_{n=1}^i f[i]$。
- $n \le 10^{15}$
~~从题面上直接复制的,因为很简练。~~
## 赛时
~~可以跳过不看。~~
看数据范围就知道不是暴力。
但赛时题面出了问题,范围是 $1\ \leq\ N\ \leq\ 10^{5}$。
当时同学说应该是 $1\ \leq\ N\ \leq\ 10^{9}$。
于是开打暴力,为了过 $10^{9}$ 规模的数据,加了点分段打表。
结果改成了 $1\ \leq\ N\ \leq\ 10^{15}$。
好好好,我看看。
一共打了大概 $1$ 个小时之后,我放弃了。
~~太菜了,没想到~~
赛时代码扔在了最后面。
## 分析
思维题。
题面的 `最高位开始连续的1` 启发了我。
枚举两个值 $i$ 和 $j$。
$i$ 表示前面有连续的 $i$ 个 $1$。
$j$ 表示在剩下的位数。
再算出左端点和右端点,每次更新。
考完总结,发现:其实在分段打表的时候,我也想过分 $2$ 段枚举什么值来算,可是就是没想出来。
实在不懂请看代码中的注释。
## 注意事项
- 开 `long long`。$k$ 在乘的时候会溢出。
## 代码
```cpp
#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
int n,k;
ll ans;
int qread()
{
int sum=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-48;ch=getchar();}
return sum*f;
}
void qprint(int x)
{
if(x>9) qprint(x/10);
putchar(x%10+48);
return;
}
void qp(int x)
{
if(x<0) x=-x,putchar('-');
qprint(x);
return;
}
void qprintll(ll x)
{
if(x>9) qprintll(x/10);
putchar(x%10+48);
return;
}
void qpll(ll x)
{
if(x<0) x=-x,putchar('-');
qprintll(x);
return;
}
int my_min(int x,int y){return x<y?x:y;}
signed main()
{
n=qread();
for(int i=1;i<=17;i++)//其实到15好像也可以,这里是指0的个数(10的i次方)。
{
k=k*10+1;
int l=k,r=k+1;
for(int j=i;j<=17;j++)
{
if(l>n) break;//如果左端点大了,退出。
int ed=my_min(r-1,n);//右端点
int st=(l-1);//左端点
int sum=ed-st;//贡献
ans+=sum;
l*=10;//得到新的左端点
r*=10;//得到新的右端点
}
}
qp(ans);
putchar('\n');
return 0;
}
## 赛时代码
```cpp
#include<bits/stdc++.h>
#define INF pow(2,31)-1
#define ll long long
#define MAXN 520
#define int long long
using namespace std;
int n;
ll ans,len;
int nws;
int zj;
int ten[MAXN];
int db[MAXN]={1,2,13,124,1235,12346,123457,1234568,12345679,123456790};
int q[MAXN];
int dy[MAXN]={0,0,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456790};
short c[MAXN];
int qread()
{
int sum=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-48;ch=getchar();}
return sum*f;
}
void qprint(int x)
{
if(x>9) qprint(x/10);
putchar(x%10+48);
return;
}
void qp(int x)
{
if(x<0) x=-x,putchar('-');
qprint(x);
return;
}
void qprintll(ll x)
{
if(x>9) qprintll(x/10);
putchar(x%10+48);
return;
}
void qpll(ll x)
{
if(x<0) x=-x,putchar('-');
qprintll(x);
return;
}
void solve()
{
/*do
{
/*int j=n;
while(j!=0)
{
if((j%10)!=1) break;
else ans++;
//if(j%10==1) ans++;
j/=10;
}
cout<<n<<" "<<ans<<endl;
len=0;
int j=n;
int k=ans;
while(j!=0)
{
c[++len]=j%10;
j/=10;
}
int t=len;
while(c[t]==1) ans++,t--;
//cout<<ans-k<<endl;
}while(n--);*/
return;
}
void get_nws()
{
int p=n;
while(p)
{
p/=10;
nws++;
}
return;
}
void get_zj()
{
zj=pow(10,(nws-1));
//cout<<zj<<endl;
return;
}
int my_min(int x,int y){return x<y?x:y;}
void _add3(int x)
{
int j=0,k=x;
while(k<=n)
{
j=k;
len=0;
while(j!=0)
{
c[++len]=j%10;
j/=10;
}
int t=len;
while(c[t]==1) ans++,t--;
k++;
}
return;
}
void _add2()
{
int b=2e8,ja=1e8;
int t=2;
while(b<=n)
{
t++;
b+=ja;
}
t--;
ans=dy[t];
int x=t*1e8;//te8;
_add3(x);
return;
}
void _add(int x)
{
int j=0,k=pow(10,x-1)+1;
//cout<<k<<endl;
int zz=my_min(n,1e8);
while(k<=zz)
{
j=k;
len=0;
while(j!=0)
{
c[++len]=j%10;
j/=10;
}
int t=len;
while(c[t]==1) ans++,t--;
//cout<<ans-k<<endl;
k++;
}
if(n>1e8)
{
_add2();
}
return;
}
void get_ans()
{
if(n>=1e8)
{
_add2();
return;
}
int i=0,z=1;
for(;i<9,z<=zj;i++,z*=10)
{
//if(z>zj) break;
//ans+=db[i];
//z*=10;
}
ans+=db[i-1];
//cout<<ans<<endl;
_add(i);
//cout<<i<<endl;
//cout<<ans<<endl;
return;
}
void get_ten()
{
for(int i=0;i<10;i++) ten[i]=pow(10,i);
return;
}
void print_ten()
{
for(int i=0;i<=9;i++) cout<<ten[i]<<" ";
cout<<endl;
return;
}
signed main()
{
//freopen("my.in","r",stdin);
//freopen("my.out","w",stdout);
get_ten();
//print_ten();
n=qread();
//solve();
get_nws();
get_zj();
get_ans();
qpll(ans);
putchar('\n');
return 0;
}
## 附
- [题目链接](https://www.luogu.com.cn/problem/AT_arc127_a)
- [我的提交记录](https://www.luogu.com.cn/record/list?pid=AT_arc127_a&user=1029900)