hdoj4611解题报告

【题目来源】  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取模 是数组的下标)

              (注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.csdn.net/qq454822252/article/details/9499355


http://user.qzone.qq.com/454822252?ADUIN=454822252&ADSESSION=1374827497&ADTAG=CLIENT.QQ.5203_MyTip.0&ADPUBNO=26218&ptlang=2052#!app=2&via=QZ.HashRefresh&pos=1374835226

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值