個位求和【增強版】ps:這一題我大一的時候寫過,同時也ac過,但是**風格確實太爛的而且有點臃腫,索性將其再寫了一遍題目描述
將乙個整數區間內所有整數的個位相加並輸出。
輸入輸入2個int型別整數m和n(m<=n),m與n之間由空格隔開。
輸出將區間[m,n]內所有整數的個位相加並輸出。
樣例輸入
1 18
樣例輸出
81
其實這題的話,就是乙個簡單的數學題,只要你能夠推出這個個位求和的公式,那麼你就能夠做出。
這裡我簡單的分析一下,對於給定區間的數m–n,其個位數可以分為m%10-9,0-9…0-9,0-n%10,對於中間的很多個0-9可以求出他們的和為45,對於左右兩邊的數字範圍其實也可以採取的方式是補齊0-9的區間,這樣就可以通過45這個特定值來計算。
*左邊補齊的數和:left_sum=((left-1)left)/2.0
;右邊補齊的數和:right_sum=((right+10)*(9-right))/2.0;
那麼總的sum為:sum=cnt*45-left_sum-right_sum;
ok,在知道了這些就可以知道你需要求的sum和是多少了,然後根據n,m的正負來分段計算,同時注意本題只是計算個位數,所以均為正數,
ps:建議不要照搬。
#include#includeusing namespace std;
long long sum(long long left,long long right,long long len)
if(right!=9)//計算右補齊
long long cnt=0;//表示有多少個45,
cnt=(len+left_len+right_len)/10;//算總個數
long long sum=0;
sum=cnt*45-left_sum-right_sum;
return sum;
}int main()
時間複雜度分析:o(1)
嗯,就是這樣,有啥建議or問題請私聊我
題解 P1630 求和
題目 發現題解都不夠優雅,就自己來一篇 首先,看清楚了,題目是 sum ai b 的餘數 而不是 sum ab i 等比數列求和了解一下 畢竟.本蒟蒻一開始就看錯了.好,進入正題,介於 a,b leq 10 9 暴力就想都不用想了,肯定過不了每一次乘法需要 o b 的時間,加法需要 o a 的時間,...
樹狀陣列 求和問題題解
題目 求和問題 描述 問題描述 在乙個長度為n的整數數列中取出連續的若干個數,並求它們的和。輸入格式 輸入由若干行組成,第一行有乙個整數n 第二行有n個整數 第三行有乙個整數m 下面m行,每行兩個整數i與j i j 表示求和的起始和終止位置。輸出格式 輸出有m行,每行乙個整數,表示這個數段數列的和。...
題解 CQOI2007 餘數求和
考慮到這個等式 a bmod b a b lfloor frac rfloor 所以我們可以得到 begin ans sum k bmod i sum k i lfloor frac rfloor end 我們可以證得若 lfloor frac rfloor 是相同的,則對應的b所取得的區間必然是連...