第七集,奇思妙想

经过一个比赛的小插曲后,小A不仅得到主办方的赏识后,还捞到了一大笔钱。有了足够的钱后,他继续出发前往那个聚会城市。由于小A和小C每天都需要赶路,他们需要多买一些舒适的袜子。在离开这个城市前,他先逛了一家袜子批发商店,该商店将不同数量的袜子放入一个个盒子中,且将盒子排成一排,小A看到这样的情景,顿时好奇(程序员的本能):

若把这些箱子围成一个圈,并且拿走一段连续的箱子,且箱子中的袜子的总数量正好等于小A要买的袜子的数量M,有多少种拿法?(假设有N个盒子,盒子编号1-N)

同在小A和小C买完了袜子之后,继续朝着聚会城市出发…

 

Input

有多组测试案例,

每组测试案例,第一行输入一个正整数N,M(1<=N<=10^6, 1<=M<=10^8),表示有N个箱子。

第二行输入N个非负整数Ai(1<=Ai<=100)、分别表示连续箱子里面的袜子的数量、

 

Output

对于每组测试案例,输出有多少种方法、

SampleInput
2 1
1 1
3 2
1 1 1
3 3
1 1 1
3 1
1 1 1
3 5
1 1 1
SampleOutput
2
3
1
3
0
在做这题的时候因为是环形的不知道怎么处理 后来看了别人的代码发现在复制一下数组就好了
真是蠢哭hh
贴上代码
 1 #include<stdio.h>
 2 #define maxn 2000005
 3 int s[maxn];
 4 void solve(int n,int m)
 5 {
 6     int l=1,r=1,sum=0,ans=0;
 7     while(l<=n&&r<=l+n)///r不能超过l+n 即刚好找一圈
 8     {
 9         if(sum>=m)
10         {
11             if(sum==m)
12                 ans++;///ans记录总共多少种情况
13             sum=sum-s[l];
14             l++;
15         }
16         else
17         {
18             sum=sum+s[r];
19             r++;
20         }
21     }
22     printf("%d\n",ans);
23     return;
24 }
25 int  main()
26 {
27     int i,n,m,a;
28     while(~scanf("%d %d",&n,&m))
29     {
30         int a=0;
31         for(i=1; i<=n; i++)
32         {
33             scanf("%d",&s[i]);
34             s[n+i]=s[i];
35             a+=s[i];///环形再复制一圈
36         }
37         if(a==m) printf("1\n");///先判断 如果全部的和等于m 则只有一种情况
38         else if(a<m)printf("0\n");///如果全部的和小于m 说明一种都不存在
39         else
40             solve(n,m);
41     }
42 }

 

 

 
posted @ 2017-12-28 20:00  star_fish  阅读(460)  评论(0编辑  收藏  举报