HDU - 6286 CCPC 2018湖南邀请赛《2018》题解

链接:https://vjudge.net/problem/HDU-6286

题意:

给两段区间,问从这两段区间内各选出一个数,能组成多少个有序数对,使得数对里的两个元素乘积为2018的倍数。

思路:

首先注意两点,区间范围是1 ~ 1e9,n^2循环是不存在的了,而本题只能使用O(1)的复杂度;

其次要注意,<2018, 1> 和 <1, 2018> 显然是两个不同的有序对。

接下来讲下大体思路,刚才提到这题正解是O(1)的,那就说明肯定存在某些规律来算答案。

首先,2018这个数,Emmm,其实挺不错的,因为它就4个因子:1,2,1009,2018。

所以我的想法是,先看最大的因子所能决定的有序对个数,找下这两段区间分别有多少数是2018的倍数,然后再用其中一个区间2018倍数的个数乘另一个区间的长度再加和即可,即:

ll sum = 0;
//区间1内2018倍数个数
ll a1 = r / 2018 - l / 2018;
if(l % 2018 == 0) a1++;
//区间2内2018倍数个数
ll a2 = R / 2018 - L / 2018;

if(L % 2018 == 0) a2++;

//ps: 这里要提一下,在某段区间 [l, r] 内找某

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值