模操作的總和,如果我們有2個號碼,說a and b
那麼如何才能找到的sum of b%i where i ranges from 1 to a
價值? 一種方法是迭代所有值從1到一個,但有沒有任何有效的方法? (比爲O(n)更好?) E.g:如果α= 4和b = 5則需要ANS = 5%1 + 5%2 + 5%3 + 5%4 = 4 感謝。發現在一系列
Q
發現在一系列
4
A
回答
4
對於i > b
,我們有b % i == b
,所以總和的一部分被在恆定的時間容易地計算((a-b)*b
,如果a >= b
,否則爲0)。
i <= b
對於那部分仍有待計算(i == b
給出0,因此可忽略不計)。你可以這樣做,在O(開方(b))的步驟,
- 對於
i <= sqrt(b)
,計算b % i
並添加總結 - 對於
i > sqrt(b)
,讓k = floor(b/i)
,然後b % i == b - k*i
和k < sqrt(b)
。因此,對於k = 1
至ceiling(sqrt(b))-1
,請撥打hi = floor(b/k)
和lo = floor(b/(k+1))
。有hi - lo
數字i
這樣k*i <= b < (k+1)*i
的b % i
對他們的總和sum_{ lo < i <= hi } (b - k*i) = (hi - lo)*b - k*(hi-lo)*(hi+lo+1)/2
。
如果a <= sqrt(b)
,只有第一個項目符合,停止在a
。如果sqrt(b) < a < b
,在第二個項目符號,請從k = floor(b/a)
到ceiling(sqrt(b))-1
和調整最小k
上限a
。
總體複雜性O(分鐘(一,SQRT(b)中))。
代碼(C):
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
unsigned long long usqrt(unsigned long long n);
unsigned long long modSum(unsigned long long a, unsigned long long b);
int main(int argc, char *argv[]){
unsigned long long a, b;
b = (argc > 1) ? strtoull(argv[argc-1],NULL,0) : 10000;
a = (argc > 2) ? strtoull(argv[1],NULL,0) : b;
printf("Sum of moduli %llu %% i for 1 <= i <= %llu: %llu\n",b,a,modSum(a,b));
return EXIT_SUCCESS;
}
unsigned long long usqrt(unsigned long long n){
unsigned long long r = (unsigned long long)sqrt(n);
while(r*r > n) --r;
while(r*(r+2) < n) ++r;
return r;
}
unsigned long long modSum(unsigned long long a, unsigned long long b){
if (a < 2 || b == 0){
return 0;
}
unsigned long long sum = 0, i, l, u, r = usqrt(b);
if (b < a){
sum += (a-b)*b;
}
u = (a < r) ? a : r;
for(i = 2; i <= u; ++i){
sum += b%i;
}
if (r < a){
u = (a < b) ? a : (b-1);
i = b/u;
l = b/(i+1);
do{
sum += (u-l)*b;
sum -= i*(u-l)*(u+l+1)/2;
++i;
u = l;
l = b/(i+1);
}while(u > r);
}
return sum;
}
+0
感謝一噸詳細的解釋:) – pranay 2012-02-17 02:29:20
相關問題
- 1. Grails在關係中發現
- 2. Mysql發現密集的系列間隙
- 3. 正則表達式組發現一系列
- 4. 發現一系列的圖像的曲線的交叉點:Matlab
- 5. Git:發現哪些提交觸及了一系列行
- 6. LINQ查詢發現一列
- 7. 發現在每列
- 8. 發現「重複」行,在一列
- 9. 錯誤在MySQL表中發現一列
- 10. 發現在Python列表
- 11. 發現陣列
- 12. 發現和列
- 13. 發現系統路徑
- 14. 第一git的承諾,現在系統發出蜂鳴聲
- 15. 如何實現一個電子郵件發佈系統在php
- 16. 如何實現forkjoin的一系列動作,現在在for循環中完成
- 17. PHP如果在另一個陣列中發現陣列
- 18. 圖表系列:每個系列一列?
- 19. 查詢,發現只有一列
- 20. 發現有重複值的行一列
- 21. 發現大多數一陣列
- 22. 一個發現設置組陣列
- 23. 發現SUM除了一些列
- 24. 其中列B在列發現我已經在那裏出現
- 25. 發現,如果一個項目出現在列表中的一個子表後,發現如果另一個項目是在同一子列表
- 26. 在硒webdriver中呈現一系列響應
- 27. Highcharts 3不能在一個系列中呈現超過1000分
- 28. 算在一系列串
- 29. 隨機數在一系列
- 30. 發現在同一個表
這是足以找到一個解決方案只對的情況下,其中A B上\ sum_ {I = B} ^一個= a(a-1)/ 2-b(b-1)/ 2。 – 2012-02-16 16:49:32