码迷,mamicode.com
首页 > 其他好文 > 详细

循环序列

时间:2017-05-06 11:42:18      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:顺序   ++   玩游戏   cal   多少   循环   ace   code   clu   

循环序列

(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.

~\(≧▽≦)/~啦啦啦思路:

首先按题目要求将xy之间的数拆分存到一个数组中,然后用另一个数组将该数组倒叙存储,(便于计算),运用前缀和,取整环和不完整环,相加

 

(v)~ 代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N = 1e5 + 6;
 6 int x,y,r,l,n,m;
 7 int a[N],s[N],b[N];
 8 
 9 void work(int x,int y){
10     n=0;
11     for(int i=x;i<=y;i++){
12         m=0;
13         for(int t=i; t ;t/=10) b[++m]=t%10;
14         for(int t=m; t ;t--) a[++n]=b[t];
15     }
16     s[0] = 0;
17     for(int i=1;i<=n;i++) s[i]= s[i-1] + a[i];//前缀和 
18 }
19 
20 int cal(int p){
21     if(p == 0) return 0;
22     int g = (p-1)/n;//
23     int r = (p-1)%n + 1;//
24     return s[n] * g + s[r];
25 }
26 
27 int main() {
28     cin>>x>>y;
29     cin>>l>>r;
30     work(x,y);
31     cout<<cal(r)-cal(l-1);
32     return 0;
33 } 

 

循环序列

标签:顺序   ++   玩游戏   cal   多少   循环   ace   code   clu   

原文地址:http://www.cnblogs.com/wsdestdq/p/6815842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!