洛谷U32670 小凯的数字(比赛)

时间:2023-01-12 00:13:55

题目网址

https://www.luogu.org/problemnew/show/U32670

题目背景

NOIP2018 原创模拟题T1

NOIP DAY1 T1 or DAY 2 T1 难度

是否发现与NOIP2017 DAY1 T1 有异曲同工之妙

题目描述

小凯有一天突发奇想,写下了一串数字:l(l+1)(l+2)...(r-1)rl(l+1)(l+2)...(r−1)r

例如:l=2,r=5时,数字为:23452345

l=8,r=12时数字为:8910111289101112

小凯很喜欢数字9,所以他想问你他写下的数字除以9的余数是多少

例如:l=2,r=5时,2345 mod 9 = 5

输入输出格式

输入格式:

第一行为数字Q,表示小凯有Q个问题

第2-Q+1行,每行两个数字 l,r 表示数字范围

输出格式:

对于每行的问题输出一行,一个数字,表示小凯问题的回答

输入输出样例

输入样例#1:
2
2 5
8 12
输出样例#1:
5
5
输入样例#2:
3
1 999
123 456
13579 24680
输出样例#2:
0
6
0

说明

样例1解释:2345 mod 9 = 5   89101112 mod 9 = 5

30% 数据满足:Q<=10;l,r<=100

50% 数据满足:Q<=100;l,r<=10000

70% 数据满足:Q<=1000;l,r<=10^6

100%数据满足:Q<=10000;l,0<r<=10^12且 l<=r

题解

根据本题的数据范围,不难发现一定是一道数论题。这一题的难度和NOIP提高组day1的第一题水平差不多,所以应该不是很难;

解决本题,首先要知道:

定理1、能被9整除的数各位数字之和能被9整除;

定理2、如果有9*n(n为自然数)个连续的数字(如题意,比如123456789),那么该数一定能被9整除

第一点很好理解,其实第二点也同样如此,根据高斯求和公式,(首项+末项)*项数/2,

有计算经验的同学一定知道,(首项+末项)和项数中一定有一个是2的倍数,所以不存在带余除法,

那么因为项数是9的倍数,所以上述公式(首项+末项)*项数/2,一定是9的倍数,所以定理2成立。

那么,根据这两个定理,本题代码就很好写了。

再整理一遍思路:

1.读入问题数量Q,循环Q次,每次读入l和r;

2.计算出数字个数(即r-l+1的值),并对9取余,即定义一个变量cnt=(r-l+1)%9;

3.从r开始,往前依次枚举cnt次(因为cnt对9取过模,所以最多循环9次)

将枚举出的数字对9取余,加入sum中;

4.输出sum对9取余即可

5.本题还有一个细节:要用long long

代码

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long using namespace std; int Q;
ll l,r; void work()
{
scanf ("%d",&Q);
while (Q--)
{
scanf ("%lld%lld",&l,&r);
ll cnt=(r-l+)%;
ll sum=;
for (ll i=,k=r;i<=cnt;i++,k--)
sum+=k%;
printf ("%lld\n",sum%);
}
return;
} int main()
{
work();
return ;
}

出处:https://www.cnblogs.com/yujustin/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
温馨提示:尽量使用版本较高的浏览器,并打开极速模式。