第七集,奇思妙想
TimeLimit:2000MS MemoryLimit:128MB
64-bit integer IO format:%I64d
Problem Description
在经过一个比赛的小插曲后,小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
1 1
1
1 2
1
1 1
3 2
1 1 1
3 3
1 1 1
1 1
1
1 2
1
SampleOutput
2
3
1
1
0
3
1
1
0
题目是思路:题目描述要连续的的一组箱子,那么可以想到用迟取法,也就是定义两个标记,head和end,一开始都指向第一个元素,如果两个标记间的元素之和少于M那么就在尾部加一个元素,如果多余的就在减去头部一个元素,如果等于就方法+1,由于本题将箱子围成一个圈,可以先初始化将所有元素放进同一个数组两遍
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
scanf("%d",&a[i]);
a[n+i]=a[i];
}
}
接下来放段核心代码