#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 構造体定義(課題1と同様)
typedef struct Node {
long long prime;
int exponent;
struct Node* next;
} Node;
// リストの情報から約数の個数と総和を求めて表示する関数
void calculateDivisors(Node* head) {
long long totalCount = 1; // 個数の積の初期値
long long totalSum = 1; // 総和の積の初期値
Node* current = head;
while (current != NULL) {
// 1. 約数の個数の計算: (各指数の数 + 1) を掛け合わせる
totalCount *= (current->exponent + 1);
// 2. 約数の総和の計算: 等比数列の和の公式を掛け合わせる
// 分子: p^(e+1) - 1
long long numerator
= (long long)pow(current
->prime
, current
->exponent
+ 1) - 1; // 分母: p - 1
long long denominator = current->prime - 1;
totalSum *= (numerator / denominator);
current = current->next; // 次のノードへ移動
}
printf("約数の個数: %lld 個\n", totalCount
); printf("約数の総和: %lld\n", totalSum
); }
// ※動作確認用のメイン関数(手動でリストを構築してテスト)
int main() {
// 例として 12 = 2^2 * 3^1 (約数は1,2,3,4,6,12の6個、和は28)
Node
* n1
= (Node
*)malloc(sizeof(Node
)); Node
* n2
= (Node
*)malloc(sizeof(Node
));
n1->prime = 2; n1->exponent = 2; n1->next = n2;
n2->prime = 3; n2->exponent = 1; n2->next = NULL;
calculateDivisors(n1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCi8vIOani+mAoOS9k+Wumue+qe+8iOiqsumhjDHjgajlkIzmp5jvvIkKdHlwZWRlZiBzdHJ1Y3QgTm9kZSB7CiAgICBsb25nIGxvbmcgcHJpbWU7CiAgICBpbnQgZXhwb25lbnQ7CiAgICBzdHJ1Y3QgTm9kZSogbmV4dDsKfSBOb2RlOwoKLy8g44Oq44K544OI44Gu5oOF5aCx44GL44KJ57SE5pWw44Gu5YCL5pWw44Go57eP5ZKM44KS5rGC44KB44Gm6KGo56S644GZ44KL6Zai5pWwCnZvaWQgY2FsY3VsYXRlRGl2aXNvcnMoTm9kZSogaGVhZCkgewogICAgbG9uZyBsb25nIHRvdGFsQ291bnQgPSAxOyAvLyDlgIvmlbDjga7nqY3jga7liJ3mnJ/lgKQKICAgIGxvbmcgbG9uZyB0b3RhbFN1bSA9IDE7ICAgLy8g57eP5ZKM44Gu56mN44Gu5Yid5pyf5YCkCiAgICBOb2RlKiBjdXJyZW50ID0gaGVhZDsKCiAgICB3aGlsZSAoY3VycmVudCAhPSBOVUxMKSB7CiAgICAgICAgLy8gMS4g57SE5pWw44Gu5YCL5pWw44Gu6KiI566XOiAo5ZCE5oyH5pWw44Gu5pWwICsgMSkg44KS5o6b44GR5ZCI44KP44Gb44KLCiAgICAgICAgdG90YWxDb3VudCAqPSAoY3VycmVudC0+ZXhwb25lbnQgKyAxKTsKCiAgICAgICAgLy8gMi4g57SE5pWw44Gu57eP5ZKM44Gu6KiI566XOiDnrYnmr5TmlbDliJfjga7lkozjga7lhazlvI/jgpLmjpvjgZHlkIjjgo/jgZvjgosKICAgICAgICAvLyDliIblrZA6IHBeKGUrMSkgLSAxCiAgICAgICAgbG9uZyBsb25nIG51bWVyYXRvciA9IChsb25nIGxvbmcpcG93KGN1cnJlbnQtPnByaW1lLCBjdXJyZW50LT5leHBvbmVudCArIDEpIC0gMTsKICAgICAgICAvLyDliIbmr406IHAgLSAxCiAgICAgICAgbG9uZyBsb25nIGRlbm9taW5hdG9yID0gY3VycmVudC0+cHJpbWUgLSAxOwogICAgICAgIAogICAgICAgIHRvdGFsU3VtICo9IChudW1lcmF0b3IgLyBkZW5vbWluYXRvcik7CgogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OyAvLyDmrKHjga7jg47jg7zjg4njgbjnp7vli5UKICAgIH0KCiAgICBwcmludGYoIue0hOaVsOOBruWAi+aVsDogJWxsZCDlgItcbiIsIHRvdGFsQ291bnQpOwogICAgcHJpbnRmKCLntITmlbDjga7nt4/lkow6ICVsbGRcbiIsIHRvdGFsU3VtKTsKfQoKLy8g4oC75YuV5L2c56K66KqN55So44Gu44Oh44Kk44Oz6Zai5pWw77yI5omL5YuV44Gn44Oq44K544OI44KS5qeL56+J44GX44Gm44OG44K544OI77yJCmludCBtYWluKCkgewogICAgLy8g5L6L44Go44GX44GmIDEyID0gMl4yICogM14xICjntITmlbDjga8xLDIsMyw0LDYsMTLjga425YCL44CB5ZKM44GvMjgpCiAgICBOb2RlKiBuMSA9IChOb2RlKiltYWxsb2Moc2l6ZW9mKE5vZGUpKTsKICAgIE5vZGUqIG4yID0gKE5vZGUqKW1hbGxvYyhzaXplb2YoTm9kZSkpOwogICAgCiAgICBuMS0+cHJpbWUgPSAyOyAgbjEtPmV4cG9uZW50ID0gMjsgIG4xLT5uZXh0ID0gbjI7CiAgICBuMi0+cHJpbWUgPSAzOyAgbjItPmV4cG9uZW50ID0gMTsgIG4yLT5uZXh0ID0gTlVMTDsKCiAgICBjYWxjdWxhdGVEaXZpc29ycyhuMSk7CgogICAgZnJlZShuMSk7CiAgICBmcmVlKG4yKTsKICAgIHJldHVybiAwOwp9