题目传送门
分析:
根据唯一分解定理:
如果是
9
9
9:那么就有唯一的因子3
那么
1
,
4
,
7
−
−
>
2
,
5
,
8
−
−
>
3
,
6
,
9
1,4,7 --> 2,5,8 --> 3,6,9
1,4,7−−>2,5,8−−>3,6,9三个颜色
18
18
18呢?
因子是
2
,
3
2,3
2,3
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
−
−
>
2
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
1,3,5,7,9,11,13,15,17-->2,4,6,8,10,12,14,16,18
1,3,5,7,9,11,13,15,17−−>2,4,6,8,10,12,14,16,18这两个颜色
但是这是两个因子:
所以
1
,
4
1,4
1,4也是一个颜色。
因此如果
n
n
n是素数,那么就有
n
n
n个颜色。
如果
n
n
n不是素数:那么根据唯一分解定理,就要分解出所有的素数因子,如果只有一个素数因子
k
k
k,那么就有
k
k
k种颜色。
(
(
0
)
+
n
∗
k
,
(
1
)
+
n
∗
k
,
(
2
)
+
n
∗
k
…
…
…
,
(
k
−
1
)
+
n
∗
k
(0)+n*k,(1)+n*k,(2)+n*k………,(k-1)+n*k
(0)+n∗k,(1)+n∗k,(2)+n∗k………,(k−1)+n∗k (
n
为
自
然
数
:
0
,
1
,
2
,
3
…
…
n为自然数:0,1,2,3……
n为自然数:0,1,2,3……))上述这些点分别都是不同的颜色
如果不止有一个素数因子
a
,
b
,
a,b,
a,b,那么在
n
中
一
定
包
括
a
∗
b
这
个
因
子
n中一定包括a*b这个因子
n中一定包括a∗b这个因子,
a
∗
b
a*b
a∗b既是
a
a
a的倍数,又是
b
b
b的倍数,因此就全部就变成了一种的颜色。
详见代码
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){
ll n,cnt=0;
cin>>n;
ll m=n;
ll num=0;
if(n==1){
printf("1");
return 0;
}
if(n==2){
printf("2");
return 0;
}
for(ll i=2;i<=n/i;i++){
if(n%i==0){
while(n%i==0){
n/=i;
}
// cout<<n<<' '<<i<<endl;
if(n!=1){
printf("1");
return 0;
}else if(n==1){
printf("%lld\n",i);
return 0;
}
}
}
printf("%lld\n",n);
return 0;
}