洛谷题单指南-进阶数论-P4942 小凯的数字

原题链接:https://www.luogu.com.cn/problem/P4942

题意解读:l(l+1)(l+2)...(r1)r​的数字模9的结果。

解题思路:

l(l+1)(l+2)...(r1)r​ 展开成l * 10^? + (l+1)*10^? + (l + 2)*10^? + ... + (r - 1) * 10^? + r

  ( l * 10? + (l+1)*10? + (l + 2)*10? + ... + (r - 1) * 10? + r ) % 9

= ( l * 10?%9 + (l+1)*10?%9 + (l + 2)*10?%9 + ... + (r - 1) * 10? + r ) % 9

由于10% 9 = 1,上式进一步简化为:

(l + l+1 + l+2 + ... + r-1 + r) % 9

= ((l + r) * (r - l + 1) / 2) % 9

如果直接算,l、r最大可到10^12,将会有溢出风险,longlong也扛不住!

根据模的性质,除以2模9转化成乘以2模9的逆元,2模9的逆元根据定义可以计算:2x ≡ 1 (mod 9),x = 5

因此上式转化为:

((l + r) * (r - l + 1)  * 5) % 9

= (((l + r)%9) * ((r - l + 1)%9)  * 5) % 9

这样就不会超出longlong的范围了

当然,如果不了解逆元,直接用高精度乘法和除法来做也完全是ok的。

100分代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL l, r, ans;

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        cin >> l >> r;
        ans = ((l + r) % 9) * ((r - l + 1) % 9) * 5; 
        cout << (ans % 9) << endl;
    }
    return 0;
}

 

posted @ 2025-09-22 21:44  hackerchef  阅读(8)  评论(0)    收藏  举报