2014-11-07 13:56:56
思路:这题用了容斥原理考虑,然后就是细节处理了。
方法:把答案写成:F(b,d) - F(a - 1,d) - F(b,c - 1) + F(a - 1,c - 1),F(x,y)的含义是从[0,x],[0,y]中选两个数使得他们的和模p等于m的方案数。
(1)处理F(x,y),首先把区间内的数全部模p,我们发现会形成: 0,1,2,....,p-1,0,1,2,...,p-1,0,1,...,然后把0,1,2,...,p-1划为一个区间(成为完整区间),可以发现两个{0,1,2,...,p-1}可以形成p对匹配使得每对匹配的两个数满足条件(也就是一个区间内所有数都能在另一个区间内找到匹配数),于是我们把[0,x]和[0,y]中所有完整区间找出来(数目:nx,ny),剩下来两个不完整的区间:[?,x],[?,y],然后我们可以把所取的完整区间右移(可以证明每个完整区间内的元素数不变,且各个相异),这样不完整区间变为:[0,tx],[0,ty]。
(2)处理不完整区间:[0,tx],[0,ty],(tx < p,ty < p),分成两部分处理:[0,m],[m+1,?],为什么呢,其实在前面证明完整区间内数都能匹配时就能发现:[0,m]的数在另一个区间内的匹配数也在[0,m]范围内,而[m+1,?]内数在另一区间内匹配数在[m+1,?]内,所以只要分两部分分别找出来即可。(有些细节处理见代码把。。。这题题不太清楚QAQ,我觉得没有画图实在不好搞,以后这种题目一定要细心,十分考验代码和思维!)
1 /*************************************************************************
2 > File Name: 4790.cpp
3 > Author: Nature
4 > Mail: [email protected]
5 > Created Time: Fri 07 Nov 2014 12:03:57 AM CST
6 ************************************************************************/
7
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include