T1
a
n
s
=
(
a
∗
d
−
b
∗
c
)
m
o
d
m
ans=(a*d-b*c)mod\ m
ans=(a∗d−b∗c)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)∗(r−l+1)/2
数据范围在
1
0
12
10^{12}
1012属于用long long都要溢出的级别(__int128大佬自便),所以我们需要边算边取模
除法的取模?不要紧的~
注意到
l
+
r
l+r
l+r和
r
−
l
+
1
r-l+1
r−l+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=l∑ri
我们其实没有必要从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;
}