Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98191 | CSYZLiuJ | 早凉的函数2 | C++ | 解答错误 | 80 | 863 MS | 1848 KB | 1330 | 2023-08-14 12:26:58 |
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 2e5 + 5; int n, a[N]; inline int f(int x){ int sum = 0; while(x){ sum += x % 10; x /= 10; } return sum; } int sum; int b[10], B[10]; int s[N]; bool F; signed main(){ ios::sync_with_stdio(false); cin >> n; for(int i = 1; i <= n; ++ i){ cin >> a[i]; if(a[i] > 9) F = 1; } if(n <= 5000){ for(int i = 1; i <= n; ++ i){ s[i] += s[i - 1]; for(int j = 1; j <= n; ++ j){ s[i] += f(a[i] + a[j]); // cout << a[i] << ' ' << a[j] << ": " << f(a[i] + a[j]) << '\n'; } } cout << s[n]; return 0; } if(!F){ for(int i = 1; i <= n; ++ i){ b[a[i]] ++; } for(int i = 0; i <= 9; ++ i){ if(!i) B[i] = b[i]; else B[i] = B[i - 1] + b[i]; } // int sum = 0; for(int i = 1; i <= n; ++ i){ if(!a[i]) continue; sum += B[9] - B[9 - a[i]]; } } for(int i = 1; i <= n; ++ i){ a[i] = f(a[i]) + a[i - 1]; } cout << a[n] * n * 2ll - sum * 9ll; return 0; } /* 啊呀啊呀,直接先拿暴力分和 B 档分罢 看起来好难啊啊啊 123 654 133 每次的进位操作都会使答案减小 9,数两两相加时每位最多进位一次 此题实质应为计算进位次数 */