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

题目网址

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)...(r1)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

 

代码

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <algorithm>
 7 #define ll long long
 8 
 9 using namespace std;
10 
11 int Q;
12 ll l,r;
13 
14 void work()
15 {
16     scanf ("%d",&Q);
17     while (Q--)
18     {
19         scanf ("%lld%lld",&l,&r);
20         ll cnt=(r-l+1)%9;
21         ll sum=0;
22         for (ll i=1,k=r;i<=cnt;i++,k--)
23             sum+=k%9;
24         printf ("%lld\n",sum%9);
25     }
26     return;
27 }
28 
29 int main()
30 {
31     work();
32     return 0;
33 }

 

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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
温馨提示:尽量使用版本较高的浏览器,并打开极速模式。
posted @ 2018-09-30 23:11  曾许流年·卿不负  阅读(575)  评论(0编辑  收藏  举报