【题目来源】
http://acm.hdu.edu.cn/showproblem.php?pid=4611
2013 Multi-University Training Contest 2
【题意】 给三个数 N, A and B.(1<=N<=1000000000, 1<=A,B<=100000). 求 Σ| n%A - n%B | ( n=0至 N-1)
【思路+详解】 N太大, 如果直接暴力求和,肯定超时。所以肯定要用比较巧妙的方法。
(以下的例子都是 A比B小)
例一:我们先来考虑一对互质的 A1=2 和 B1=3,它们的最小公倍数是A*B=6,现在我们看下面的表格:
我们把 0 到 5 放入了表格中
A1=2 余数 0 1 B1=3 余数 0 1 2
———— ——————
0 1 [ 0 1] [ 2
2 3 3] [4 5]
4 5 【表1】 【表2 】
根据【表1】 我们人为的把【表2】分为3组,这3组分别是【表1】里面的3排 [0 1]、[2 3]、[4 5],同时我们也可以看见这3组分别的第一个元素在【表2】中的余数各不相同。
我们开一个大小为B1的数组 num。
数组元素 组 值 Σ| n%A - n%B | 公式 公式应用范围
—————————— ———— ———— ———— —— ———— —— ———— — — — — — — — — — — — — — —
num[0] [0 1] 0 0 数组下标为0
num[1] [4 5] 2*1 =2 A * 数组下标 数组下标从1到(B-A)
num[2] [2 3] 1*2 + (3-2)*1=3 (A-k)*数组下标 +(B-数组下标)*k 数组下标从 (B-A+1) 到结束
【表3】(注1:组的第一个元素 对B取模 是数组的下标)
例二: 现在我们在来看一对不互质的情况,我们都知道不互质的数在除以他们的最大公约数之后就互质了,我们令A2=6,B2=9,,这里A和B的值恰好是上面A1 B1的3倍,也就是说A2 B2的最大公约数是3,最小公倍数是18,现在我们看下面的2个表格:
我们把 0 到 17 放入了表格中
A2=6 余数 0 1 2 3 4 5 B2=9 余数 0 1 2 3 4 5 6 7 8
———— —— —— —— —— —— —— —— —— —— —— —
0 1 2 3 4 5 [0 1 2 3 4 5] [6 7 8
6 7 8 9 10 11 9 10 11] [12 13 14 15 16 17]
12 13 14 15 16 17
你会发现这里的每一组的值等于【例一】中对应组的值 乘以 3(3是他们的最大公约数)的平方:
[0 1 2 3 4 5] 的值为 0
[6 7 8 9 10 11] 的值为 【例一】中 [2 3]的值乘以 3^2 = 27
[12 13 14 15 16 17] 的值为 【例一】中 [4 5] 的值乘以 3^2 = 18
有了上面的分析,现在我们只要2次求商取余,再将剩余部分直接统计,即可得答案。
【题意】 给三个数 N, A and B.(1<=N<=1000000000, 1<=A,B<=100000). 求 Σ| n%A - n%B | ( n=0至 N-1)
【思路+详解】 N太大, 如果直接暴力求和,肯定超时。所以肯定要用比较巧妙的方法。
(以下的例子都是 A比B小)
例一:我们先来考虑一对互质的 A1=2 和 B1=3,它们的最小公倍数是A*B=6,现在我们看下面的表格:
我们把 0 到 5 放入了表格中
A1=2 余数 0 1 B1=3 余数 0 1 2
———— ——————
0 1 [ 0 1] [ 2
2 3 3] [4 5]
4 5 【表1】 【表2 】
根据【表1】 我们人为的把【表2】分为3组,这3组分别是【表1】里面的3排 [0 1]、[2 3]、[4 5],同时我们也可以看见这3组分别的第一个元素在【表2】中的余数各不相同。
我们开一个大小为B1的数组 num。
数组元素 组 值 Σ| n%A - n%B | 公式 公式应用范围
—————————— ———— ———— ———— —— ———— —— ———— — — — — — — — — — — — — — —
num[0] [0 1] 0 0 数组下标为0
num[1] [4 5] 2*1 =2 A * 数组下标 数组下标从1到(B-A)
num[2] [2 3] 1*2 + (3-2)*1=3 (A-k)*数组下标 +(B-数组下标)*k 数组下标从 (B-A+1) 到结束
【表3】(注1:组的第一个元素 对B取模 是数组的下标)
(注2:值为 Σ| n%A - n%B | n取对应组中的所有元素 )
(注3: 这里的k从1开始累加)
例二: 现在我们在来看一对不互质的情况,我们都知道不互质的数在除以他们的最大公约数之后就互质了,我们令A2=6,B2=9,,这里A和B的值恰好是上面A1 B1的3倍,也就是说A2 B2的最大公约数是3,最小公倍数是18,现在我们看下面的2个表格:
我们把 0 到 17 放入了表格中
A2=6 余数 0 1 2 3 4 5 B2=9 余数 0 1 2 3 4 5 6 7 8
———— —— —— —— —— —— —— —— —— —— —— —
0 1 2 3 4 5 [0 1 2 3 4 5] [6 7 8
6 7 8 9 10 11 9 10 11] [12 13 14 15 16 17]
12 13 14 15 16 17
你会发现这里的每一组的值等于【例一】中对应组的值 乘以 3(3是他们的最大公约数)的平方:
[0 1 2 3 4 5] 的值为 0
[6 7 8 9 10 11] 的值为 【例一】中 [2 3]的值乘以 3^2 = 27
[12 13 14 15 16 17] 的值为 【例一】中 [4 5] 的值乘以 3^2 = 18
有了上面的分析,现在我们只要2次求商取余,再将剩余部分直接统计,即可得答案。
此外,很多中间过程会超int,最好都long long 吧,本人被坑了很久。
【转载请注明出处】http://blog.youkuaiyun.com/qq454822252/article/details/9499355