タイトルの出典:Codeforces Round#632(Div。2)
タイトルのリンク:F.ケイトと不完全さ
大まかな意味
数値nを指定すると、Sは1からnまでのセットであり、長さn、2、3、4 ...の長さnまでの任意の2つの数値の最大公約数の最小値を見つけます。たとえば、セット{2、4、6、9}があり、その値は6と9の3の最大公約数である必要があり、長さ2のサブセットの最大公約数の最小値を選択できます。セット{4、9}、これは1です。
アイデア
強制するとタイムアウトになりますので、まずはこのルールを勉強しましょう。nが10に等しい場合、長さ2のサブセットは最大公約数が1の2つの数値を選択し、10未満の2つの素数のサブセットを選択する必要があるとすると、答えは1です;長さ3のサブセットはまだ選択されています3つの素数、答えはまだ1 ...長さが6になるまで、最初に1、2、3、5、7を選択し、素数がないことを確認します。したがって、最小の最大公約数、つまり4から選択します。答えは2。
n = 10
ん | 選択されたサブセット | 答え |
---|---|---|
2 | 1,2 | 1 |
3 | 1、2、3 | 1 |
4 | 1、2、3、5 | 1 |
5 | 1、2、3、5、7 | 1 |
6 | 1、2、3、5、7、4 | 2 |
7 | 1、2、3、5、7、4、6 | 3 |
8 | 1、2、3、5、7、4、6、9 | 3 |
9 | 1、2、3、5、7、4、6、9、8 | 4 |
10 | 1、2、3、5、7、4、6、9、8、10 | 5 |
だから、nは10倍の答えに等しい111123345で
シミュレーションが再び何も表示されないかもしれませんが、あなたは将来に目を向けるの後に、それが使用することですので、逆の発想を。
- 最初に、最大のサブセット、つまり長さ10のサブセット自体を選択します。2つの数値の最大公約数は5です。
- 次に、長さ9のサブセットを選択します。現時点では、10の数値から9を選択しないでください。長さ10のサブセットから要素を削除するだけです。明らかに10を削除し、10と5の最大公約数は5です。なくなった。
- 次に、長さが8の場合、もう1つの番号が削除されます。つまり、8が削除され、4が削除されます。
- 長さが7の場合、6を削除し、3は削除されます。
- 長さが6の場合、9を削除しても3を失います。
この時点で、答えが1を除く各数値の最大因数、つまり、2-nからのすべての数値の最大因数の次数であることを確認することは難しくありません。
実装コード
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
using namespace std;
#define N 500005
typedef long long ll;
int a[N];
int check(int n){
int i;
if(n==2)
return 1;
for(i=2;i<=sqrt(n);i++){
if(n%i==0)
return n/i;
}
return 1;
}
int main(){
int i,n,l=0;
cin>>n;
for(i=2;i<=n;i++)
a[l++]=check(i);
sort(a,a+l);
for(i=0;i<l;i++){
cout<<a[i];
if(i!=l-1)
cout<<" ";
}
return 0;
}