リソース制限
制限時間:1.0秒メモリ制限:256.0MB
問題の説明
正の整数Nが与えられた場合、1からNまでの3つの数値を選択するように依頼します。それらの最小公倍数の最大値はいくつですか。
入力フォーマット
正の整数Nを入力します。
出力フォーマット
見つかった最小公倍数を表す整数を出力します。
サンプル入力
9
サンプル出力
504
データの規模と慣習
1 <= N <= 10 ^ 6。
分析(Na Yixiaoが最も魅力的です)この教師の分析は非常に包括的です!!!この先生の分析を転載してください〜
nとn-1およびn-2が互いに素である場合、結果はこれら3つの数の積になります。
数論の知識によると、1より大きい隣接する2つの自然数は互いに素です。
nが奇数、nとn-2が両方とも奇数、n-1が偶数の場合、3つの最大公約数は2ではなく、これら3つの数は連続である場合、それらは2より大きくなります。それらの共通の除数になることはできません。結果はそれらの3つの製品です。
また、nが偶数の場合、nとn-2は両方とも偶数であるため、n *(n-1)*(n-2)は確実に機能しません。したがって、n-2をn-3に変更することしかできません。つまり、n *(n-1)*(n-3)であり、これら3つの数が相互に素数である場合、それは結果である必要があります。
ただし、nとn-3の差は3であるため、一方の数値が3で割り切れる場合、もう一方の数値も3で割り切れる必要があります。そして、一方が不可能な場合、もう一方は絶対に不可能です。また、nは偶数であり、n-3は奇数であるため、2を2つの共通因子にすることはできません。3より大きい数の場合、これら3つの数またはそれらの任意の2つの公約数になることは確かに不可能です。したがって、3を判断するだけで済みます。
nが3を除算できる場合、n *(n-1)*(n-3)は絶対に機能しません。nとn-3の公約数は3であり、結果は小さくなければならないため、続行することしかできません。 1つは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を使用すると分割されません〜
この質問は良いです!!!