1. 程式人生 > >洛谷U32670 小凱的數字(比賽)

洛谷U32670 小凱的數字(比賽)

一行 題解 pri 網址 tex 明顯 turn fff --

題目網址

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^12l<=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/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

洛谷U32670 小凱的數字(比賽)