hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数。
思路:数据较多,处理会很慢。对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数进行暴力求两两之积的因子个数就行了。1s左右就能出结果。低于50的就会WA了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[100005]; 4 pair<int,int> pa[100005]; 5 int getAllFactors(int x, vector<int> &vect) //辅助! 6 { 7 for (int j = 2 ; j * j <= x ; ++ j) 8 { 9 while (x % j == 0) 10 vect.push_back(j) , x /= j; 11 } 12 if(x>1) 13 vect.push_back(x); 14 return vect.size(); 15 } 16 17 int getFactors(vector<int> &num) 18 { 19 vector< vector<int> > all; 20 all.resize(num.size()); 21 for(int i=0; i<num.size(); i++) 22 getAllFactors( num[i], all[i]); 23 24 vector<int> tmp; 25 for(int i=0; i<all.size(); i++) 26 tmp.insert(tmp.end(), all[i].begin(), all[i].end()); 27 sort(tmp.begin(), tmp.end()); 28 29 int z=1; 30 for (int i = 0 ; i < tmp.size() ; i++) 31 { 32 int l = i; 33 while (l < tmp.size() && tmp[l] ==tmp[i]) 34 ++ l; 35 z *= l - i + 1; 36 i = l - 1; 37 } 38 return z; 39 } 40 41 int factors(int N) 42 { 43 if(1 == N) return 1; 44 int cnt = 2; 45 for (int j = 2 ; j * j <= N ; j++) 46 { 47 if (N % j == 0) 48 { 49 cnt++; 50 if (j * j != N) 51 cnt++; 52 } 53 } 54 return cnt; 55 } 56 57 int main() { 58 //freopen("input.txt", "r", stdin); 59 int t; 60 while(cin>>t) 61 { 62 for(int i=0; i<t; i++) 63 { 64 scanf("%d",&a[i]); 65 pa[i]=make_pair(factors(a[i]),a[i]); 66 } 67 68 sort(pa,pa+t); 69 reverse(pa,pa+t); 70 vector<int> tmp; 71 int n = t>500? 500: t; 72 int ans=0; 73 for(int i=0; i<n; i++) 74 { 75 for(int j=i; j<n; j++) 76 { 77 tmp.clear(); 78 tmp.push_back(pa[i].second); 79 tmp.push_back(pa[j].second); 80 ans=max(getFactors(tmp), ans); 81 } 82 } 83 cout<<ans<<endl; 84 } 85 return 0; 86 }