[アルゴリズムトレーニング] ALGO-2最大公倍数と最小公倍数

リソース制限

制限時間: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を使用すると分割されません〜

この質問は良いです!

おすすめ

転載: blog.csdn.net/WKX_5/article/details/114330237