連接:https://ac.nowcoder.com/acm/contest/940/E
c++
kotori拿到了一些正整數。她決定從每一個正整數取出一個素因子。可是,kotori有強迫症,她不容許兩個不一樣的正整數取出相同的素因子。spa
她想知道,最終全部取出的數的和的最小值是多少?code
注:若a%k==0,則稱k是a的因子。若一個數有且僅有兩個因子,則稱其是素數。顯然1只有一個因子,不是素數。blog
第一行一個正整數n,表明kotori拿到正整數的個數。
第二行共有n個數ai,表示每一個正整數的值。
保證不存在兩個相等的正整數。
1<=n<=10
2<=ai<=1000
一個正整數,表明取出的素因子之和的最小值。若不存在合法的取法,則輸出-1。
1<=n<=10
2<=ai<=1000
思路:對每一個數先進行拆分素數,而後暴力搜就行。
代碼:
#include<bits/stdc++.h> using namespace std; #define LL long long #define INF 2000000000 #define eps 1e-8 #define pi 3.141592653589793 const LL mod = 1e9+7; int k,prime[200],x[11],n; int mp[1001],ans = 100000000; vector<int>v[11]; void init(){ k = 0; prime[k] = 2;k++; prime[k] = 3;k++; for(int i = 5 ; i <= 1100 ; i++){ int end = sqrt(i); int flag = 1; for(int j = 2 ; j <= end ; j++){ if(i%j == 0){ flag = 0;break; } } if(flag == 1) { prime[k]=i; k++; } } } void dfs(int dep,int sum){ if(dep == n){ ans = min(ans,sum);return; } for(int i = 0 ; i < v[dep].size() ; i ++){ if(!mp[v[dep][i]]){ mp[v[dep][i]] = 1; dfs(dep+1,sum+v[dep][i]); mp[v[dep][i]] = 0; } } } int main() { init(); scanf("%d",&n); int flag = 1; memset(mp,0,sizeof(mp)); for(int i = 0 ; i < n ; i ++){ scanf("%d",&x[i]); for(int j = 0 ; j < k ; j++){ int number = x[i]; if(number%prime[j] == 0){ v[i].push_back(prime[j]); while(number%prime[j] == 0){ number/=prime[j]; } } if(number == 1)break; } } dfs(0,0); printf("%d\n",ans == 100000000?-1:ans); } /* 5 4 5 66 29 124 */