1 条题解
-
0
注意到
按个位、十位等逐位单独算每位数字总和
用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
- 上传者