問題の意味
シーケンスを考えます。
7以下除数の数
の製品が完璧な四角であるような最小配列を求めて
問題の解決策
2個の素因数の最大にこれ以上の7よりも除数と同等。
そして、我々は唯一の素因数の奇数電源を気に。
だから我々は、不思議な力を残して、正方形のすべての項目を削除します。
限りこの数が2の奇数累乗であるように、すなわち、二乗用語です。
私たちは、構築されたエッジの数も2素因数のエッジのために、考えてみましょう。
素数、1、さらには自身がある場合。
答えはに寄与しないので、素数が必要とされていないではありません
ように
、例えば、接続1及び10は、ために、2つを持っていることがあれば
、その後も質的因子が存在しなければなりません
と
。
だから、直接、
と
することができます。
最小のリングを探すため、上記のすべての素因数のための2つの番号を持っている必要があり、それは偶数乗です。
最小のリングを探します
、点を列挙します
、あなたは最小のリングにどの時点でわからないので。
しかし、最小のリング未満のポイントが常にあることを保証するために、
、別段の数があります
、A。
列挙
について
。
決意部が訪問し、次のポイントは、その環に、訪問されていない場合、次の点に、この縁部から記録することです。
側面のラベルに行わ
レコード缶なので、それはとても空に複雑さを避けるために、直流電流源に等しいこと。
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn = 1e6+50;
typedef long long ll;
int cnt=0;
vector<pair<int,int> >G[maxn];
int vis[maxn],len[maxn],ans=0x3f3f3f3f;
void bfs(int i){
queue<int>q;
q.push(i);
memset(len,0x3f,sizeof(len));
len[i]=0;
while(!q.empty()){
int u=q.front();q.pop();
// cout<<u<<":"<<" ";
for(auto it:G[u]){
int v=it.first,id=it.second;
if(vis[id]==i)continue;
// cout<<v<<" ";
vis[id]=i;
if(len[v]!=0x3f3f3f3f)ans=min(ans,len[u]+len[v]+1);
else len[v]=len[u]+1,q.push(v);
}
// puts("");
}
}
int main(){
int n,x;cin>>n;
FOR(i,1,n){
scanf("%d",&x);
for(int j=2;j<=sqrt(x);j++){
while(x%(j*j)==0)x/=j*j;
}
if(x==1){
puts("1");
return 0;
}
vector<int>tmp;
for(int j=2;j<=sqrt(x);j++){
if(x%j==0){
tmp.push_back(j);
while(x%j==0)x/=j;
}
}
if(x!=1)tmp.push_back(x);
if(tmp.size()==1){
G[1].push_back(make_pair(x,++cnt));
G[x].push_back(make_pair(1,cnt));
}
else{
G[tmp[0]].push_back(make_pair(tmp[1],++cnt));
G[tmp[1]].push_back(make_pair(tmp[0],cnt));
}
}
FOR(i,1,sqrt(maxn-1))bfs(i);
if(ans==0x3f3f3f3f)puts("-1");
else cout<<ans<<endl;
}
実際には、この質問は、私はこの問題は解決されないことを確認するために始めたが、多くの人々は、ビルド除数側にインターネットを使用して、私は定数ができ少ないし、素因数で、大きなビットだと思います 倍の縁。最後に、実行します 。