0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アルゴリズムと数学 演習問題集 042 - Sum of Divisors

Last updated at Posted at 2023-05-23

記事概要

アルゴリズムと数学 演習問題集 042 - Sum of Divisorsのとりあえず動くコードと説明.https://atcoder.jp/contests/math-and-algorithm/tasks/abc172_d

注意

アルゴリズム初心者が書いています.時間内の動作は確認してますが、必ずしも最適解ではないです.

とりあえずコード

042_main.cpp
///////////////////////////
// 042 - Sum of Divisors //
///////////////////////////

#include <iostream>
#include <vector>

using ll = long long int;

using std::vector;

int main(void) 
{
	//-------------------------------- 入力 --------------------------------//
	int N;
	std::cin >> N;

	//-------------------------------- 計算 --------------------------------//
	vector<ll> divisor_num(N + 1, 1);

	// divisor_num[i]にiの約数の個数を格納する
	for (int i = 2; i <= N; ++i) {
		for (int j = i; j <= N; j += i) {
			divisor_num[j] += 1;
		}
	}

	// 出力値を計算
	ll ans = 0;
	for (int i = 1; i <= N; ++i) {
		ans += i * divisor_num[i];
	}

	//-------------------------------- 出力 --------------------------------//
	std::cout << ans << std::endl;
}

説明

この問題は、整数nの約数の個数の計算をN回繰り返して答えを計算すると時間が足らなくなります.
整数nの約数を求めるのではなく、1~Nまでの内nを約数として持つものはどれかという考えで計算していかなければなりません.

例えばn=2のときであれば、nを約数としてもつ値は2つおきに現れます.同じようにn=3であれば3つおき現れます.
image.png

この性質を利用して、配列divisor_numをn間隔で1増やす操作を$n:1~N$繰り返します.

これによりdivisor_num[i]にはiの約数の個数が格納されているので、最後に$\sum^N_{k=1}k \times divisorNum[k]$を計算すれば、求める答えが得られます.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?