CF 628 E. EhabのREAL数論の問題

問題の意味

シーケンスを考えます。
7以下除数の数
の製品が完璧な四角であるような最小配列を求めて

問題の解決策

2個の素因数の最大にこれ以上の7よりも除数と同等。
そして、我々は唯一の素因数の奇数電源を気に。
だから我々は、不思議な力を残して、正方形のすべての項目を削除します。
限りこの数が2の奇数累乗であるように、すなわち、二乗用語です。

私たちは、構築されたエッジの数も2素因数のエッジのために、考えてみましょう。
素数、1、さらには自身がある場合。

答えはに寄与しないので、素数が必要とされていないではありません
ように 10 = 2 5 10 = 2 * 5 、例えば、接続1及び10は、ために、2つを持っていることがあれば 10 2 10 * 2 、その後も質的因子が存在しなければなりません 2 2 5 5
だから、直接、 2 2 5 5 することができます。

最小のリングを探すため、上記のすべての素因数のための2つの番号を持っている必要があり、それは偶数乗です。

最小のリングを探します b f s BFS 、点を列挙します b f s BFS 、あなたは最小のリングにどの時点でわからないので。
しかし、最小のリング未満のポイントが常にあることを保証するために、 1 e 3 1E3 、別段の数があります > 1 e 6 > 1E6 、A。
列挙 1 e 3 1E3 について b f s BFS

b f s BFS 決意部が訪問し、次のポイントは、その環に、訪問されていない場合、次の点に、この縁部から記録することです。
側面のラベルに行わ v i s VIS レコード缶なので、それはとても空に複雑さを避けるために、直流電流源に等しいこと。

#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;
}

実際には、この質問は、私はこの問題は解決されないことを確認するために始めたが、多くの人々は、ビルド除数側にインターネットを使用して、私は定数ができ少ないし、素因数で、大きなビットだと思います 7 7 倍の縁。最後に、実行します 1300 m s 1300ms

ここに画像を挿入説明

公開された203元の記事 ウォン称賛17 ビュー20000 +

おすすめ

転載: blog.csdn.net/mxYlulu/article/details/104964928