问题描述
彩排了一次,老师不太满意。当然啦,取每位同学的号数来找最大公约数显然不太合理。于是老师给每位同学评了一个能力值。于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约数)最大。但因为节目太多了,而且每个节目需要的人数又不知道。老师想要知道所有情况下能达到的最大默契程度是多少。这下子更麻烦了,还是交给你吧~
PS:一个数的最大公约数即本身。
输入格式:
第一行一个正整数n。
第二行为n个空格隔开的正整数,表示每个学生的能力值。
输出格式:
总共n行,第i行为k=i情况下的最大默契程度。
数论题,感觉智商不够用了啊。。。看起来很简单的题想了很长时间啊。
给出一个数列,求出在里面找出i个数字的最大公约数。
找出每个数倍数的个数,然后取c[1...n]的最大值,就是取出i个数的最大公约数。
1 //又是毕业季II 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[1000005],c[100005]; 5 int n,k; 6 int main(){ 7 scanf("%d",&n); 8 int cnt=0; 9 int len=0; 10 for(int i=1;i<=n;i++){ 11 scanf("%d",&k); 12 a[k]++; 13 len=max(len,k); 14 } 15 for(int i=1;i<=len;i++){ 16 cnt=0; 17 for(int j=1;j*i<=len;j++){ 18 cnt+=a[i*j]; 19 } 20 for(int j=1;j<=cnt;j++){ 21 c[j]=max(c[j],i); 22 } 23 } 24 for(int i=1;i<=n;i++){ 25 printf("%d ",c[i]); 26 } 27 return 0; 28 }