洛谷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)...(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
代碼
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 小凱的數字(比賽)