循环序列
(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的长度不大于10000,X,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 ", cal(r) - cal(l-1)); 38 return 0; 39 }