题目描述
在遥远的大麦哲伦星系有一颗盛产宝石的行星,这种宝石可以发出美丽的光芒因此广受宇宙公民的喜爱,现在一支地球的采矿小队来到了这颗神奇的行星并且成功开采了n颗宝石,他们准备利用这些宝石制作项链,每个项链都有一个美丽值,他们希望获得美丽值最大的项链,每一颗宝石都有一个光芒值ai(i=1..n),项链的美丽值等于组成项链的宝石的光芒值的最大公约数 (比如由光芒值为 6,9,12宝石组成的项链的美丽值为3)。现在小队队长决定先暂时制作一个项链,当取i(i=1..n)颗宝石制做时总会对应一个最大美丽值fi(i=1...n),现在他想知道出现次数最多fi的值(如果次数相同选fi值大的)。
输入
第一行输入一个正整数n,第二行输入n个正整数ai(i=1..n)。
输出
一个正整数w,表示出现次数最多的fi的值。
输入样例 Copy
6
1 2 2 4 3 6
输出样例 Puts
2
提示
n<=1e4,ai<=1e6
一个数的最大公约数即本身。
样例:i=1,选(6)f1=6;
i=2,选(6,3)f2=3;
i=3,选(2,2,4)f3=2;
i=4,选(2,2,4,6)f4=2;
i=5,选(1,2,2,3,4)f5=1;
i=6,选(1,2,2,4,3,6)f6=1;
发现i=3和i=4有fi=2,出现两次所以w=fi=2。
题解
#include<stdio.h>
int num[1000010], sum[1000010];
void func(int x)//求每个数的约数
{
for (int i = 1; i <= x / i;i++)
if(x%i==0)
{
num[i]++;//标记每种约数的出现次数
if(x/i!=i)num[x / i]++;
}
}
int max(int x,int y)//返回最大值
{
if(x>y)return x;
else return y;
}
int main()
{
int n, maxn = 0, ans = 1, w = 0, res = 0;
scanf("%d", &n);
for (int i = 1; i <= n;i++)
{
int x;
scanf("%d", &x);
func(x);
maxn = max(x, maxn);//maxn记录最大数也就是最大的约数
}
for (int i = maxn; i >= 1 && ans <= n;)//i从maxn开始以满足每种项链的美丽值最大
{
if(num[i]>=ans)
{
sum[i]++;//sum记录对应约数(美丽值)的出现次数
if(sum[i]>res)
w = i, res = sum[i];//res记录次数的最大值,w记录对应的美丽值
ans++;//ans为你需要选择的宝石数,如果num[i]成功则组成的宝石数加一
}
else i--;//如果这个约数无法满足要求则遍历其他约数
}
printf("%d", w);
return 0;
}