にMOD操作の合計を見つけ、我々はsum of b%i where i ranges from 1 to a
の値を見つけることができますどのように、その後a and b
言うの? 1つの方法は1からaまでのすべての値を反復することですが、効率的な方法はありますか? (O(N)よりも良い?) 例えば:もし= 4、B = 5、必要なのANS = 5%1 + 5%2 + 5%3 + 5%4 = 4 おかげ。 i > b
について範囲
Q
範囲
4
A
答えて
4
和の一部が容易((a-b)*b
、a >= b
もし、そうでなければ0)を一定時間で計算されるように、我々は、b % i == b
を有します。 i <= b
ため
一部(従って無視することができる、i == b
は0を返す)が計算されていません。あなたはO(SQRT(B))の手順、
i <= sqrt(b)
については
- 、中
b % i
を計算し、b % i == b - k*i
、その後、k = floor(b/i)
せ、i > sqrt(b)
については - を合計し、
k < sqrt(b)
に追加することを行うことができます。したがって、k = 1
〜ceiling(sqrt(b))-1
の場合は、hi = floor(b/k)
とlo = floor(b/(k+1))
とします。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
あるi
ようhi - lo
番号があります。
a <= sqrt(b)
の場合は、最初の箇条書きのみが適用され、a
で停止します。 sqrt(b) < a < b
場合、第二弾では、k = floor(b/a)
からceiling(sqrt(b))-1
に実行し、a
に最小k
の上限を調整します。
全体の複雑さO(min(a、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
関連する問題
- 1. 責任範囲の範囲
- 2. ループセル範囲とクリーン範囲
- 3. 範囲とスコープ範囲
- 4. 範囲シークバー設定範囲
- 5. plotly.jsの範囲範囲
- 6. ループ範囲の範囲
- 7. 範囲を重複範囲の範囲に分割
- 8. 日付範囲フィールドの範囲集計
- 9. vba範囲オフセット範囲の相対値
- 10. IP範囲とIP範囲 - 動的テキストボックス
- 11. ベクトルが範囲外/範囲チェック
- 12. svn diffの改訂範囲の範囲
- 13. 日付範囲の累積数範囲
- 14. groupbyの範囲の範囲 - パンダ
- 15. coutブーストの範囲:要素の範囲
- 16. ベクトルのベクトルの範囲の範囲
- 17. 範囲
- 18. 範囲
- 19. 範囲
- 20. 範囲
- 21. 例えば数値の範囲外と範囲内の範囲の
- 22. 範囲/セグメントツリーRuby
- 23. equal_rangeと範囲
- 24. whileループエスケープ範囲
- 25. Excelの範囲
- 26. バージョン範囲:グラデル
- 27. 範囲オブジェクトエラー
- 28. Requireの範囲
- 29. Countifsと範囲
- 30. コピー範囲は
それが唯一のケースのための解決策を見つけるのに十分なの B \ sum_ {I = B} ^そう= a(a-1)/ 2-b(b-1)/ 2となる。 –