17.4.28 清北水题 2 循环序列

时间:2021-12-15 20:29:34

循环序列

(circulate.cpp/c/pas)

(1s/256M)

 

题目描述

Alice与Bob在玩游戏:

Alice首先给出两个数X与Y(X<=Y);

Bob则按顺序将X,X+1,X+2,…,Y-1,Y写成一个大数S。

Alice最后将S首尾相连,让其围成一个圈。

这时,Bob想知道,从S的开头出发,往后的第L到第R数字之和是多少。

 

输入格式(circulate.in)

第一行四个整数X,Y,L,R,代表Alice的两个数字和Bob想要知道的第L位到第R位的数字之和。

 

输出格式(circulate.out)

仅一行,一个整数M,代表第L位到第R位的数字之和。

 

样例输入

10 11 4 12

 

样例输出

7

 

样例解释

Bob将数字写成一行大数S = 1011;围成一个圈后,从第4位到第12位分别是1,1,0,1,1,1,0,1,1,它们的和是7.

 

数据范围与限制

对于50%的数据,L=1, X,Y,L,R<=1000

对于100%的数据,S的长度不大于10000X,Y,L,R<=100000000.

模拟;

我一上来就读错题,没想到A俩点;

 

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int N = 1001;
 5 int x, y, l, r;
 6 int n, a[N], s[N];
 7 int m, b[N];
 8 void work(int x, int y)
 9 {
10     n = 0;
11     for(int i=x; i<=y; i++)
12     {    
13         m = 0;
14         int t=i;
15         while(t!=0)
16          {
17              b[++m]=t%10;
18              t/=10;
19          }
20         for(int t=m; t; t--) a[++n] = b[t];
21     }    
22     s[0] = 0;
23     for(int i=1; i<=n; i++) s[i] = s[i-1] + a[i];
24 }
25 int cal(int p)
26 {
27     if(p == 0) return 0;
28     int g = (p) / n;
29     int r = (p) % n + 1;
30     return s[n] * g + s[r];
31 }
32 int main()
33 {
34     scanf("%d%d", &x, &y);
35     scanf("%d%d", &l, &r);
36     work(x, y);    
37     printf("%d\n", cal(r) - cal(l-1));    
38     return 0;
39 }