COCI 2010-4- 3:iks

就是说有N个数。。然后每次可以把一个数的质因子扔给另一个数。。让最终全体数gcd尽量大。。并求出最小步数。。 很明显分质因子讨论。。每个因子算出平均拥有次数(round down)。。然后对每个不够的全部补上就可以了。。 但我0分。。为什么呢?我很迷惑。。后来发现我少写了一行。。该死的样例!
现在直接A掉了。。。555
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=100;
int n,minstep=0;
set<int> Prime;
int A[maxn];
void getPrime(int x)
{
if(x%2==0)    Prime.insert(2);
while(x%2==0) x/=2;
int p=x;
for(int i=3;i*i<=p&&x!=1;i+=2)
while(x%i==0)
{
Prime.insert(i);
x/=i;
}
if(x!=1) Prime.insert(x);
}
vector<int> Ps;
void init()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>A[i],getPrime(A[i]);
Ps=vector<int>(Prime.begin(),Prime.end());
}
int CalAPrime(int x)
{
static int con[maxn];
memset(con,0,sizeof(con));//这行没写。。全部算错。。0分。。TMD
int sum=0;
memset(con,0,sizeof(0));
for(int i=0;i<n;i++)
{
int t=A[i];
while(t%x==0)
con[i]++,t/=x,sum++;
}
int a=sum/n;
for(int i=0;i<n;i++)
if(con[i]<a)
minstep+=a-con[i];
int res=1;for(int i=0;i<a;i++) res*=x;
return res;
}
int main()
{
//freopen("in","r",stdin);
//freopen("out","w",stdout);
init();ll ans=1;
for(int i=0;i<Ps.size();i++)
ans*=CalAPrime(Ps[i]);
cout<<ans<<" "<<minstep<<endl;
}

Leave a Reply

Your email address will not be published. Required fields are marked *