티스토리 뷰

 

https://www.acmicpc.net/problem/28437

 

28437번: 막대 만들기

첫 줄에 $Q$개의 수를 공백으로 구분해 출력합니다. $i$번째 수는 길이가 $L_i$인 막대를 만드는 방법의 수입니다. 가능한 모든 입력에 대해 답이 $10^9$을 넘지 않음을 증명할 수 있습니다.

www.acmicpc.net

 

const input = require('fs')
	.readFileSync('./dev/stdin')
	.toString()
	.trim()
	.split('\n')
	.map((v) => v.split(' ').map(Number));
const N = input[0][0];
const A = input[1];
const Q = input[2][0];
const L = input[3];
let dp = Array(100001).fill(0);
A.forEach((a) => {
	dp[a] = 1;
});

for (let i = 1; i <= 100000; i++) {
	const dest = i;

	const sqrt = Math.floor(Math.sqrt(dest));

	const possible = new Set();

	for (let i = 1; i <= sqrt; i++) {
		if (dest % i == 0) {
			possible.add(i);
			possible.add(dest / i);
		}
	}
	const sum = [...possible].reduce((r, v) => r + dp[v], 0);
	dp[i] = sum;
}
const answer = [];
for (let l = 0; l < Q; l++) {
	const dest = L[l];
	answer.push(dp[dest]);
}
console.log(answer.join(' '));

 

 

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함