1 条题解

  • 0
    @ 2026-6-2 23:09:14

    注意到

    个位、十位等逐位单独算每位数字总和

    用d记位权,c=n/(d*10) 算出完整周期数

    每周期该位 0~9 累加和 45,

    先累加45*d*c;再取余数 r=n%(d*10) 处理零散尾数

    h=r/d是尾数段当前位最大值,

    先补 0~h-1 的和 h(h-1)/2*d*,

    再加 h 出现 r%d+1 次的贡献,

    逐位累加得到 1~n 全部数位和。

    当然位数DP也可以在这里我就不写了

    当然位数DP也可以在这里我就不写了

    当然位数DP也可以在这里我就不写了

    C++

    ll n;
    int main()
    {
        AC;
        int t; cin>>t;
        while(t--)
        {
            cin>>n;
            if(n<=0)
            {
                cout<<0<<'\n';
                continue;
            }
            ll sum=0;
            ll d=1;
            while(d<=n)
            {
                ll c=n/(d*10);
                sum+=45*d*c;
                ll r=n%(d*10);
                if(r>=d)
                {
                    ll h=r/d;
                    sum+=(h*(h-1)/2)*d;
                    sum+=(r%d+1)*h;
                }
                d*=10;
            }
            cout<<sum<<'\n';
        }
        return 0;
    }
    

    Python

    import sys
    def main():
        data=sys.stdin.read().split()
        t=int(data[0])
        for n in map(int,data[1:t+1]):
            if n<=0:
                print(0)
                continue
            s=0
            d=1
            while d<=n:
                c=n//(d*10)
                s+=45*d*c
                r=n%(d*10)
                if r>=d:
                    h=r//d
                    s+=h*(h-1)//2*d
                    s+=(r%d+1)*h
                d*=10
            print(s)
    if __name__=="__main__":
        main()
    
    
    • 1

    信息

    ID
    1166
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    3
    已通过
    2
    上传者