1 条题解
-
0
乍一看觉得很像模拟题,也就是从 枚举到 ,接着枚举每个数位上的数字求和。实际上,数据范围太大,模拟是过不了的。这其实是一道数学题。可以考虑统计 这 个数中各位上是 的个数。
例如:,先考虑 个数中个位上分别是 的个数,先来看 ,显然 里个位是 的数有 个, 到 也是 个。
那么没统计的数字就是 这 个,显然个位是 的又增加 个。
再来看十位:类似的来看 ,则十位是 的数各有 个,剩下还有 ,则十位是 的个数分别增加 个,十位是 的增加 个。
以此类推。
#include<iostream> using namespace std; int getm(int n) { int count=0; while(n) { n/=10; count++; } return count; } int main() { int n; cin>>n; int count[10]={0}; int p=1,m=getm(n); while(m--) { p*=10; int t=(n/p)*p; for(int i=1;i<=9;i++)count[i]+=t/10; t=n-t; int x=t/(p/10); for(int i=1;i<x;i++)count[i]+=p/10; count[x]+=t-x*(p/10)+1; } long long ans=0; for(int i=1;i<=9;i++)ans+=count[i]*i; cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 10
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者