scau 2012新生賽 G只有神知道的世界

2021-09-06 07:00:55 字數 2120 閱讀 6498

數論水題,但是因為自己數論比較弱,而且這題也想了半個小時,所以還放上來

題意:

對於任意乙個非負數n,我們定義d(n) 為n上奇數數字的和加上兩倍偶數數字的和。舉個例子:d(567) = 5 + 6 * 2 + 7 = 24, d(314159) = 3 + 1 + 2 * 4 + 1 + 5 + 9 = 27.  

令f(n)表示d(n)的最後一位數字。例如:f(567) = 4, f(314159) = 7。

你的問題是,給你兩個數a, b,你要計算出∑f(i), i ∈ [a, b]

第一行輸入乙個整數t,表述有t組case。(t <=1000)

接下來t行,每行輸入兩個數字a, b (0 <= a <= b <= 400,000,000)

每一行輸出乙個整數,表示題目所要求的和。

3

1 828 138

314159 314159

36

4957

此題很明顯的數論(數學題),資料很大,顯然不可能用迴圈否則必定超時,只能發掘它的巧妙之處直接計算,這是數學題的特點,用對的演算法,時間複雜度往往是o(1),不對的話,一般是tle,還有可能wa

這題首先想到了分治法統計在ab區間內所有數字出現過的次數,然後求和再求模,簡單證明一下這個方法發現是錯的,再用了幾組資料發現也是錯的,所以拋棄了這個方法。再想,會不會是有什麼規律,但是一眼也看不出什麼特別的規律,當時只知道乙個規律,從0到9的fn分別是0,1,4,3,8,5,2,7,6,9,也就是剛好0到9這10個數字又出現了一遍,和為45。然後再紙上老老實實列出了0到30的所有fn,列到29的時候頓悟了。是存在乙個週期,週期是10,在週期以外的數字單獨處理,因為週期是10,所有週期以外的數字不會超過10個,最多9個,而週期以內的數字乙個數學公式解決,時間複雜度可以說是幾乎o(1)

那麼這個週期是什麼?

那就是從任意乙個數字m開始,這個數字滿足乙個條件個位數是0,一直到m+9(那麼顯然m+9的個位數就是9),一共10個數字,這個10個數字的fn之和為45

這個東西的證明寫起來有些麻煩就不寫了,稍微思考一下誰都懂的

所以給出區間[h,l],要保證h的個位數為0,l的個位數為9,如果不滿足,則單獨求h的fn,並且讓h遞增知道h個位數等於0為止,同理若l個位數不為9,則單獨求l的fn,並讓l遞減直到個位數等於9為止

預處理後[h,l]就是乙個包含1個或多個週期的區間,求出區間長度並求出週期個數,每個週期的fn和為45,

則len=(l-h+1),c=len/10; s=c*45;

ans=s+之前單獨計算的h和l部分的fn值

然後注意處理乙個特殊情況就是區間[h,l]的長度都不滿足乙個週期,也就是h遞增和l遞減之後區間已經全部單獨計算完了,這時候就不用算什麼週期了

嗯,總的來說還是一道水題,現在還沒有加強數論(數學)題的訓練,以後要加強訓練啊

#include #include 

char s[50

];int

h,l,ans;

int get_dn(int

n)

return

sum;

}int get_fn(int

n)int

main()

while(h<=l)

if(h>l) //

已經算完了

printf("

%d\n

",ans);

else

}return0;

}

新生賽心得

新生賽發揮正常,rank8。心情感受 比賽前 學長 們說送熱水袋開心剛好缺乙個熱水袋有了上次藍橋杯選拔賽爆零的經驗,這次真的就是想打完就跑最好那個熱水袋,總之就是很輕鬆。結果最後拿了rank8看到白書!好想要,但是被前面的人拿走了,後來上台的時候大概是acm女生太少了所以男生就比較起鬨我就懵了,隨便...

新生賽補題

題目大意 構造乙個長度為n的嚴格遞增序列,每個數都屬於 1,m 求方案數,結果模998244353。dp的轉移方程 第一位數 i 代表的是遍歷到第幾個數了,j代表的是當前位是幾。dp i j dp i 1 j dp i j 1 ac include using namespace std const...

SCAU 18107 校賽排名

description 校賽結束了,每乙個參賽選手由3個資料項構成 通過題數,用時分鐘數,姓名 排名按照通過題數排序 通過題數多的排前,同題數的,罰時少的排前。如果題數相同,罰時也相同,而按資料讀取的先後排。給你n個參賽選手的資料,按排序先後,輸出姓名 輸入格式 第乙個數為n,n 500000 此後...