틀림은 무엇입니까?
출제
한사람 한 대의 PC를 지급받고 있는 직원 N인 전원이, 타인의 PC를 사용하는 조합은 몇 가지인가?
사고방식
이것은 사례 수의 완전 순열 (교란 순열이라고도 함)이라고합니다.
N이 2~4까지라면 수동으로 푸는 것이 편하지만, 그 이상의 경우는 점화식을 사용할 필요가 있다.
만약 총당으로 풀려고 하면 매우 난문이 된다.
여기는 고맙게 과거의 위인의 영지에 빠지기로 합니다.
완전 순열의 총수를 구하는 점화식은 이것.
이것을 보면 A1 or A2 가 될 때까지 재귀적으로 호출하면 좋은 것을 알 수 있다.
답변
이상의 내용에 의해 이런 느낌으로 해 보았다.
/* 完全順列の個数(モンモール数) */
long long montmort_number(int n) {
if (n == 1) {
return 0;
}
else if (n == 2) {
return 1;
}
return (n - 1) * (montmort_number(n - 1) + montmort_number(n - 2));
}
int main() {
int i, l, N;
char s[80];
for (; ~scanf("%s", s);) {
l = strlen(s);
for (N = 0, i = 0; i < l ; i++)
N = (N * 10) + s[i] - '0';
sprintf(s, "%lld", montmort_number(N));
puts(s);
}
return 0;
}
[結果]
montmort_number(1) => 0
montmort_number(2) => 1
montmort_number(3) => 2
montmort_number(4) => 9
montmort_number(5) => 44
montmort_number(6) => 265
montmort_number(7) => 1854
감상
4명까지라면 수동으로 시도하는 것도 있지만 5명 이후라면 어려울까.
7명이라면 1854/5040거리도 있을까.
소스의 동작은 재귀를 사용하고 있기 때문에 매우 느립니다.
반복의 처리를 사용할 수 있으면 좀 더 빨라진다고 생각한다.
Reference
이 문제에 관하여(틀림은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatusuku/items/82fa9aa1e0300f710c01
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이것은 사례 수의 완전 순열 (교란 순열이라고도 함)이라고합니다.
N이 2~4까지라면 수동으로 푸는 것이 편하지만, 그 이상의 경우는 점화식을 사용할 필요가 있다.
만약 총당으로 풀려고 하면 매우 난문이 된다.
여기는 고맙게 과거의 위인의 영지에 빠지기로 합니다.
완전 순열의 총수를 구하는 점화식은 이것.
이것을 보면 A1 or A2 가 될 때까지 재귀적으로 호출하면 좋은 것을 알 수 있다.
답변
이상의 내용에 의해 이런 느낌으로 해 보았다.
/* 完全順列の個数(モンモール数) */
long long montmort_number(int n) {
if (n == 1) {
return 0;
}
else if (n == 2) {
return 1;
}
return (n - 1) * (montmort_number(n - 1) + montmort_number(n - 2));
}
int main() {
int i, l, N;
char s[80];
for (; ~scanf("%s", s);) {
l = strlen(s);
for (N = 0, i = 0; i < l ; i++)
N = (N * 10) + s[i] - '0';
sprintf(s, "%lld", montmort_number(N));
puts(s);
}
return 0;
}
[結果]
montmort_number(1) => 0
montmort_number(2) => 1
montmort_number(3) => 2
montmort_number(4) => 9
montmort_number(5) => 44
montmort_number(6) => 265
montmort_number(7) => 1854
감상
4명까지라면 수동으로 시도하는 것도 있지만 5명 이후라면 어려울까.
7명이라면 1854/5040거리도 있을까.
소스의 동작은 재귀를 사용하고 있기 때문에 매우 느립니다.
반복의 처리를 사용할 수 있으면 좀 더 빨라진다고 생각한다.
Reference
이 문제에 관하여(틀림은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatusuku/items/82fa9aa1e0300f710c01
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/* 完全順列の個数(モンモール数) */
long long montmort_number(int n) {
if (n == 1) {
return 0;
}
else if (n == 2) {
return 1;
}
return (n - 1) * (montmort_number(n - 1) + montmort_number(n - 2));
}
int main() {
int i, l, N;
char s[80];
for (; ~scanf("%s", s);) {
l = strlen(s);
for (N = 0, i = 0; i < l ; i++)
N = (N * 10) + s[i] - '0';
sprintf(s, "%lld", montmort_number(N));
puts(s);
}
return 0;
}
[結果]
montmort_number(1) => 0
montmort_number(2) => 1
montmort_number(3) => 2
montmort_number(4) => 9
montmort_number(5) => 44
montmort_number(6) => 265
montmort_number(7) => 1854
4명까지라면 수동으로 시도하는 것도 있지만 5명 이후라면 어려울까.
7명이라면 1854/5040거리도 있을까.
소스의 동작은 재귀를 사용하고 있기 때문에 매우 느립니다.
반복의 처리를 사용할 수 있으면 좀 더 빨라진다고 생각한다.
Reference
이 문제에 관하여(틀림은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tatusuku/items/82fa9aa1e0300f710c01텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)