1,1,2,3から始まるフィボナッチ数列の100桁目の数字は何か
n = 30
fib = integer(n)
fib[1] = fib[2] = 1
for (i in 3:n) {
fib[i] = fib[i-1]+fib[i-2]
}
ans = paste(fib, collapse="")
if (nchar(ans) >= 100) {
substring(ans, 100, 100)
}
1 から 100 までの素数を 2 つ選び,それぞれ p, q とする。
以下の 2 つの条件を満たす自然数 e が p + q 個になるような p, q の組み合わせをすべて求めよ。
条件1:0 < e < (p - 1)(q - 1)
条件2:gcd((p - 1)(q - 1), e) = 1
( (p - 1)(q - 1) と e の最大公約数が 1 である)
普通に書いても,この程度の計算量なら,簡単に求めることができるのだが。
prime = c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97)
euclid = function(m, n) {
repeat {
mod = m %% n
if (mod == 0) return(n)
m = n
n = mod
}
}
func = function(x, y) {
count = 0
for (e in seq_len((x-1)*(y-1)-1)) {
count = count+(euclid((x-1)*(y-1), e) == 1)
}
count
}
for (i in 1:(length(prime)-1)) {
for (j in (i+1): length(prime)) {
if (func(prime[i], prime[j]) == prime[i]+prime[j]) {
print(c(prime[i], prime[j]))
}
}
180 以上 189 以下の 10 個の整数の中から異なる 3 個 a, b, c を選び,和が 560 になる組み合わせを全て求めるワンライナーを書け。
Rscript -e "n = 180:189; a = 179+which(outer(outer(n, n, '+'), n, '+') == 560, arr.ind=TRUE); b = a[,1] < a[,2] & a[,2] < a[,3]; a[b,]"
dim1 dim2 dim3
[1,] 185 187 188
[2,] 185 186 189
[3,] 184 187 189
[4,] 183 188 189
以下の方が,短いか。
Rscript -e "a = expand.grid(180:189, 180:189, 180:189); a[rowSums(a)==560 & a[,1] < a[,2] & a[,2] < a[,3],]"
Var1 Var2 Var3
876 185 187 188
966 185 186 189
975 184 187 189
984 183 188 189
異なる 3 桁の整数 a, b, cが,以下の条件を満たすとき,a, b, c を求めるワンライナーを書け
1. aはbより261小さい。
2. aはcより333大きい。
3. cはbの100の位の数と一の位の数を入れ替えた数である。
4. aは7の倍数である。
まあ,結果出力が微妙だけど。
Rscript -e "a = 7*1:(999 %/% 7); c = a - 333; b = a + 261; x = c >= 100 & b <= 999 & c %% 10 == b %/% 100 & b %% 10 == c %/% 100; cbind(a[x], b[x], c[x])"
[,1] [,2] [,3]
[1,] 490 751 157
[2,] 581 842 248
[3,] 672 933 339