자원 제한
시간 제한 : 1.0 초 메모리 제한 : 256.0MB
문제 설명
양의 정수 N이 주어지면 1에서 N까지의 세 숫자를 선택하도록 요청하십시오. 최소 공배수의 최대 값은 얼마입니까?
입력 형식
양의 정수 N을 입력합니다.
출력 형식
찾은 최소 공배수를 나타내는 정수를 출력합니다.
샘플 입력
9
샘플 출력
504
데이터 규모 및 규칙
1 <= N <= 10 ^ 6。
분석 ( Na Yixiao이 가장 매력적입니다 )이 선생님의 분석은 매우 포괄적입니다! ! ! 이 선생님의 분석을 다시 인쇄하세요 ~
n과 n-1 및 n-2가 서로 소수 인 경우 결과는이 세 숫자의 곱입니다.
수 이론의 지식에 따르면 : 1보다 큰 인접한 두 자연수는 서로 소수입니다.
n이 홀수이고, n과 n-2가 모두 홀수이고, n-1이 짝수 일 때 세 개의 공약수는 확실히 2가 아닙니다. 연속, 2보다 큽니다. 어떤 숫자도 그들 중 어느 두 개도 공약수가 될 수 없습니다. 결과는 그 세 가지의 결과입니다.
n이 짝수이면 n * (n-1) * (n-2)는 확실히 작동하지 않을 것입니다. n과 n-2는 둘 다 짝수이기 때문에 n-2를 n-3으로 만 변경할 수 있습니다. 즉, n * (n-1) * (n-3),이 세 숫자가 서로 소수이면 결과 여야합니다.
그러나 n과 n-3의 차이가 3이기 때문에 숫자 중 하나를 3으로 나눌 수있을 때 다른 숫자도 반드시 있어야합니다. 그리고 그들 중 하나가 불가능할 때 다른 하나는 확실히 불가능합니다 그리고 n은 짝수이고 n-3은 홀수이기 때문에 2는 둘의 공약수가 될 수 없습니다. 3보다 큰 숫자의 경우이 세 숫자 또는 두 숫자의 공약수가되는 것은 확실히 불가능합니다. 따라서 3 개만 판단하면됩니다.
n이 3을 나눌 수 있다면 n * (n-1) * (n-3)은 확실히 작동하지 않을 것입니다. 왜냐하면 n과 n-3은 공약수가 3이고 그 결과는 작아야하기 때문입니다. One은 n * (n-1) * (n-4)이고 n-4는 짝수이므로 다음으로 계속할 수 없습니다 .n * (n-1) * (n-5) = n ^ 3 -6 * n ^ 2 + 5 * n 그리고 이것이 가능하다면 그 값은 (n-1) * (n-2) * (n-3) = n ^ 3 -6 * n ^보다 작아야합니다. 2 + 11n-6 (n> 1 인 경우) 및 (n-1) * (n-2) * (n-3)은 마지막 홀수에서 요구 사항을 충족하기 위해 찾을 수 있으므로 판단 할 필요가 없습니다. n-5까지. 직접 답을 (n-1) * (n-2) * (n-3);
그리고 n은 3을 나눌 수 없습니다. 그러면 결과는 n * (n-1) * (n-3)입니다. n도 n-3도 3을 나눌 수 없기 때문에 n-1이 3을 나눌 수 있는지는 중요하지 않습니다. , 그러나 다른 숫자는 불가능합니다. 위는 인증되었습니다.
암호
#include<iostream>
using namespace std;
int main(){
long long int n,minb=1;
cin>>n;
if(n<3){
for(int i=2;i<n;i++)
minb*=i;
printf("%d",minb);
return 0;
}
if(n%2==1) printf("%lld",n*(n-1)*(n-2));//n为奇数
else{ //n为偶数
if(n%3==0) printf("%lld",(n-1)*(n-2)*(n-3));
else printf("%lld",n*(n-1)*(n-3));
}
return 0;
}
또한 long long 사용에주의하세요. 10 ^ 6은 매우 크기 때문에 int를 사용하면 분할되지 않습니다 ~
이 질문은 좋습니다! ! !