题解:洛谷 P4942 小凯的数字
【题目来源】
【题目描述】
小凯有一天突发奇想,写下了一串数字:\(\overline{l(l+1)(l+2)...(r-1)r}\)。
例如:\(l=2,r=5\) 时,数字为:\(2345\)。
\(l=8,r=12\) 时数字为:\(89101112\)。
小凯很喜欢数字 \(9\),所以他想问你他写下的数字除以 \(9\) 的余数是多少?
例如:\(l=2,r=5\) 时,\(2345\bmod9 = 5\)。
【输入】
第一行为数字 \(Q\),表示小凯有 \(Q\) 个问题。
第 \(2\) 到 \(Q+1\) 行,每行两个数字 \(l,r\) 表示数字范围。
【输出】
对于每行的问题输出一行,一个数字,表示小凯问题的回答。
【输入样例】
2
2 5
8 12
【输出样例】
5
5
【算法标签】
《洛谷 P4942 小凯的数字》 #模拟# #数学# #高精度# #逆元#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long // 将int定义为long long类型,避免大数溢出
int q, l, r, a, b, ans; // q: 查询次数,l,r: 区间端点,a,b: 临时变量,ans: 结果
signed main() // 使用signed main()替代int main(),因为int被重定义为long long
{
cin >> q; // 读入查询次数
while (q--) // 处理每个查询
{
cin >> l >> r; // 读入区间[l, r]
ans = 0; // 初始化结果
// 计算区间内所有数字的数位和模9的结果
// 利用数论性质:一个数的数位和模9等于该数本身模9
// 区间[l, r]内所有数字的和模9等于这些数字模9的和再模9
for (int i = l % 9; i <= r % 9 + 9; i++)
{
ans += i; // 累加模9的余数
}
// 输出最终结果模9
cout << ans % 9 << endl;
}
return 0;
}
【运行结果】
2
2 5
5
8 12
5
浙公网安备 33010602011771号