#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll l,r;
int main (int argc, char *argv[]){
std::cin >> n;for(int i =1;i <= n ;++i )// i: 1->n{
std::cin >> l >> r;
ll sum_lr =(l+r)%9;
ll len =(r-l+1)%9;
ll ans =( sum_lr * len *5)%9;
std::cout << ans <<"\n";}return0;}
#include <iostream>
using namespace std;
int main(){// 优化输入输出
ios::sync_with_stdio(false);
cin.tie(0);
int Q;
cin >> Q;while(Q--){
long long l, r;
cin >> l >> r;// 1. 算出总长度
long long len = r - l +1;// 2. 算出除以9之后的余数(也就是需要计算的数的个数)// 如果能被9整除,remain就是0,循环都不用进,直接输出0
long long remain = len %9;
long long ans =0;// 3. 只计算这剩下的几个数即可// 循环最多跑 8 次,飞快!for(int i =0; i < remain; i++){
ans =(ans +(l + i))%9;}
cout << ans <<"\n";}return0;}
解法3: 不用求逆元
这是一份针对你这段代码的简洁版题解,适合放在博客或题解区。它强调了代码中“奇偶性判断”的巧妙之处。
题目要求计算 l 到 r 所有数字拼接后的模 9 余数。根据模 9 的同余性质,这等价于求 数列 [l,r] 的和模 9。
我们使用等差数列求和公式:
Sum=2(l+r)×(r−l+1)
这段代码并没有直接套用公式计算(因为直接相乘会爆 long long),而是采用了一个非常聪明的**“先除后乘”**策略。
设 A=l+r(首尾和),B=r−l+1(项数)。
公式即为:2A×B。
关键点:奇偶性判断
因为数列的和一定是整数,所以分子 A×B 一定是偶数。这意味着 A 和 B 中至少有一个是偶数。
代码通过 if 判断来处理这个除法:
cpp
copy
1 2 3 4 5
if(a %2==0)
a /=2;// 如果 A 是偶数,直接让 A 除以 2else
b /=2;// 如果 A 是奇数,那么 B 一定是偶数,让 B 除以 2
结果计算
经过上面的处理,分母的 2 已经被消除,且 A 和 B 仍然都在 long long 的安全范围内。
此时问题转化为求 A×B(mod9)。根据同余性质:
(A×B)(mod9)=((Amod9)×(Bmod9))(mod9)
代码直接输出:
cpp
copy
1 2
cout <<((a %9)*(b %9))%9<< endl;
cpp
copy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<bits/stdc++.h>
using namespace std;
long long q, l, r,a,b;
int main(){
cin >> q;while(q--){
cin >> l >> r;
a = l + r;
b = r - l +1;if(a %2==0)
a /=2;else
b /=2;
cout <<((a %9)*(b %9))%9<< endl;}return0;}