【悬关】题解审核未通过
  • 板块灌水区
  • 楼主YuYuanPQ
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/1/27 10:43
  • 上次更新2024/1/27 13:26:53
查看原帖
【悬关】题解审核未通过
1029900
YuYuanPQ楼主2024/1/27 10:43

题解审核反馈:“很遗憾,您上传的题解 AT_arc127_a [ARC127A] Leading 1s 题解 未能通过审核。原因是 【中文】与【英文、数字或公式】之间应以半角空格隔开; 。”

求大佬们帮助。

以下为题解源码(因为有代码片段,所以下面题解的源码分成 33 部分):

第 11 部分

# 洛谷 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;
}

第 22 部分

## 赛时代码

```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;
}

第 33 部分

## 附

- [题目链接](https://www.luogu.com.cn/problem/AT_arc127_a)
- [我的提交记录](https://www.luogu.com.cn/record/list?pid=AT_arc127_a&user=1029900)
2024/1/27 10:43
加载中...