记录编号 |
188050 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2013]计数问题 |
最终得分 |
100 |
用户昵称 |
Skyo |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.005 s |
提交时间 |
2015-09-21 19:40:57 |
内存使用 |
0.31 MiB |
显示代码纯文本
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- typedef long long L;
- using namespace std;
-
- L a, b, c, _10[15], ans[15], f[15][15][15];
- bool flag;
-
- void get_f(){
- _10[0] = 1;
- for(int i = 1; i < 15; i++) _10[i] = _10[i-1]*10;
- for(int i = 1; i < 10; i++) f[i][1][i] = 1;
-
- for(int i = 1; i < 10; i++)
- for(int j = 2; j < 15; j++){
- f[i][j][1] = _10[j-2]*(j-1);
- for(int k = 2; k < 10; k++)
- f[i][j][k] = f[i][j][1];
- }
- for(int i = 1; i < 10; i++)
- for(int j = 2; j < 15; j++){
- f[i][j][i] += _10[j-1];
- }
- }
-
- void get_all(){
- int la = 0, lb = 0;
- L ta = a-1, tb = b, all = 0;
- while(ta){
- la++, ta /= 10;
- }
- while(tb){
- lb++, tb /= 10;
- }
- for(int i = la; i < lb; i++){
- all += (_10[i]-_10[i-1])*i;
- } all += (b-_10[lb-1]+1)*lb;
- all -= (a-_10[la-1])*la;
- ans[0] = all;
- }
-
- L d(L k, int i){
- if(!k) return 0;
- int fir, len = 0;
- L t = k, res = 0;
- while(t){
- len++, t /= 10;
- } fir = k / _10[len-1];
- if(len == 1) return i <= k;
-
- for(int j = 1; j < fir; j++){
- res += f[j][len][i];
- }
- res += d(k%_10[len-1], i) + d(_10[len-1]-1, i) + (fir==i)*(k%_10[len-1]+1);
- return res;
- }
-
- int main()
- {
- freopen("count2013.in", "r", stdin);
- freopen("count2013.out", "w", stdout);
- scanf("%lld %lld", &b, &c);
- a = 1;
- get_f();
- get_all();
- for(int i = 1; i < 10; i++){
- ans[i] = d(b, i) - d(a-1, i);
- ans[0] -= ans[i];
- }
- printf("%lld ", ans[c]);
- return 0;
- }