本题的那个操作可以想到相当于把自己的一个质因数给了别人.
那么既然大家的质因数可以共享,不如我们先给同一个人,然后再均分.均分后的那个数就是调整完的最大公约数.
那么本题的策略就有了,找到所有数的所有质因子与质数和,答案是∏prime[i]^(⌊sum[prime[i]]/n⌋);
做第二问的时候可以查看所有数的答案包含的那个质因子的指数是多少,如果少了当然要别人送来,多了不一定需要给别人.23333.总之统计比平均少多少就好.
using namespace std; int quick(int a,int b)//a^b { int ans=1; while(b>0) { if(b%2==1) ans=ans*a; b=b/2;a=a*a; } return ans; } int i,f,t; int n; int v[1000010],prime[80000]; int sum,o[110][80000],a[110][80000],ans; int main() { //freopen("123.in","r",stdin); //freopen("123.out","w",stdout); n=1000000; for(i=2;i<=n;i++) { if(v[i]==0) { sum++; v[i]=i; prime[sum]=i; } for(f=1;f<=sum;f++) { if(prime[f]>v[i]||prime[f]>n/i)break; v[i*prime[f]]=prime[f]; } } memset(v,0,sizeof(v)); for(n=read(),i=1;i<=n;i++) { t=read(); for(f=1;f<=sum&&t>=prime[f];f++) { if(t%prime[f]==0) { while(t%prime[f]==0) { a[i][f]++; v[f]++; t=t/prime[f]; } } } } ans=1; for(i=1;i<=sum;i++) { v[i]=v[i]/n; if(v[i]!=0) ans=ans*quick(prime[i],v[i]); } write(ans); ans=0; for(i=1;i<=n;i++) { for(f=1;f<=sum;f++) if(v[f]>a[i][f]) ans+=v[f]-a[i][f]; } cout<<ans; }