Integers: Recreation One (5kyu)
Description
1, 246, 2, 123, 3, 82, 6, 41
are the divisors of number 246
. Squaring these divisors we get: 1, 60516, 4, 15129, 9, 6724, 36, 1681
. The sum of these squares is 84100
which is 290 * 290
.
Task
Find all integers between m
and n
(m and n integers with 1 <= m <= n) such that the sum of their squared divisors is itself a square.
We will return an array of subarrays or of tuples (in C an array of Pair) or a string. The subarrays (or tuples or Pairs) will have two elements: first the number the squared divisors of which is a square and then the sum of the squared divisors.
Example:
list_squared(1, 250) --> [[1, 1], [42, 2500], [246, 84100]]
list_squared(42, 250) --> [[42, 2500], [246, 84100]]
The form of the examples may change according to the language, see “Sample Tests”.
Note
In Fortran - as in any other language - the returned string is not permitted to contain any redundant trailing whitespace: you can use dynamically allocated character strings.
Solution
The step I took is to
- Go over all of the possible divisors between 1…num.sqrt()
- If it is the divisor of num, let sum += its square and another divisor’s square
- After checking all possible items, see if the square of the root of sum equals to sum itself.
- If yes, push (num, sum) into answer vector
- Else continue
fn list_squared(m: u64, n: u64) -> Vec<(u64, u64)> {
let mut ans = Vec::new();
for num in m..=n {
let mut sum = 0;
let root = (num as f64).sqrt() as u64;
for item in 1..=root {
match num % item {
0 => {
sum += item * item;
let another = num / item;
if another != item {
sum += another * another;
}
}
_ => continue
}
}
let root_sum = ((sum as f64).sqrt()) as u64;
if root_sum * root_sum == sum {
ans.push((num, sum));
}
}
ans
}