2021-09-28机考SOL

2021-09-28机考SOL

T1

a n s = ( a ∗ d − b ∗ c ) m o d   m ans=(a*d-b*c)mod\ m ans=(adbc)mod m
注意:负数取模在C++中结果仍为负数,解决方法详见代码

#include <bits/stdc++.h>
using namespace std;
long long a, b, c, d, m, ans;
int main()
{
    cin >> a >> b >> c >> d >> m;
    ans = (a * d - b * c) % m;
    if (ans < 0)
        ans += m;
    cout << ans;
}

T2

解法1

注意到对9取模的特性,我们只需要计算各位数字之和,而这其实等价于计算 ∑ i = l r i \sum_{i=l}^{r}i i=lri,那么 a n s = ( l + r ) ∗ ( r − l + 1 ) / 2 ans=(l+r)*(r-l+1)/2 ans=(l+r)(rl+1)/2
数据范围在 1 0 12 10^{12} 1012属于用long long都要溢出的级别(__int128大佬自便),所以我们需要边算边取模
除法的取模?不要紧的~
注意到 l + r l+r l+r r − l + 1 r-l+1 rl+1一定是一奇一偶,我们只需要把那个偶数找出来先除以2即可

#include <bits/stdc++.h>
using namespace std;
long long l, r, a, b;
int main()
{
    cin >> l >> r;
    a = l + r, b = r - l + 1;
    if (a % 2)
        b /= 2, b %= 9;
    else
        a /= 2, a %= 9;
    cout << a * b % 9;
}

此题做法很多,这只是本蒟蒻的一点拙见(考场思路)

解法2

如果您是在觉得上面的方法过于复杂恶心难懂以至于你想顺着网线来暴打博主,不妨考虑以下解法:
我们可以考虑上述求和式 ∑ i = l r i \sum_{i=l}^{r}i i=lri
我们其实没有必要从l加到r,因为周期性,模9余0、余1……余8的数会9个一周期重复出现,每一个周期的所有数加起来仍然为9的倍数,所以我们不用考虑那些完整的周期(这些周期内的数求和模9余0),只需要考虑不完整的那一个周期(当然也有可能没有不完整的周期)

#include <bits/stdc++.h>
using namespace std;
long long l, r, a, b;
int main()
{
    cin >> l >> r;
    r = l + (r - l) % 9;
    cout << (l + r) * (r - l + 1) / 2 % 9;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值