[白俊BOJ]17425号:薬水の和


📌 リファレンス
引き渡しアルゴリズム研究に関わる問題は19週目からBellogに記録される(18週前に復習してアップロードする予定)🤗) 他の個人が回答した基準やプログラマの質問は、自分が意味があると思っている部分だけをフィルタリングしてBellogに記録します.Bellogにアップロードされていない他の質問やコードを知りたい場合は、次のGithubでさらに確認できます.👀 ご来店ありがとうございます🙏
💚 github | dianstar/Algorithm-BOJ
💚 github | dianestar/Algorithm-Programmers

code.plus問題セット:テスト符号化の準備-基礎|数学


17425号:約数の和|問題ショートカット

回答(2022年02月3日THU)💻)


解の核心


昨日解いた17427号:薬水の和2問と同じです.
入力は1つの数字だけを受信できません.
T(1<=T<=10000)個のテストケース.
17427号と同じ方法で解くと、またタイムアウトが発生します
したがって、動的プログラミングの方法は、次のとおりです.
与えられた自然数Nの範囲N=1~N=10000の全てのg(N)値を求める.
入力に応じて値を出力する方法を選択してください

🔽 コード(C+)

#include <iostream>
using namespace std;

#define MAX_NUM 1000001

int arr[MAX_NUM]; // arr[A]: f(A)의 값, 즉 A의 모든 약수를 더한 값
long long sum[MAX_NUM]; // sum[x]: g(x)의 값, 즉 x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값

int main() {
    for (int i=1; i<MAX_NUM; i++) {
        for (int j=1; i*j<MAX_NUM; j++) {
            arr[i*j] += i;
        }
    }
    
    sum[1] = arr[1];
    for (int i=2; i<MAX_NUM; i++) {
        sum[i] = sum[i-1] + arr[i];
    }

    int T;
    scanf("%d", &T);

    int N;
    for (int i=0; i<T; i++) {
        scanf("%d", &N);
        printf("%lld\n", sum[N]);
    }
    
    return 0;
}