您的位置:首页 > 运维架构 > Shell

Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B. Bash's Big Day 数论+贪心

2017-01-14 01:15 459 查看
B. Bash's Big Day

time limit per test
2 seconds

memory limit per test
512 megabytes

input
standard input

output
standard output

Bash has set out on a journey to become the greatest Pokemon master. To get his first Pokemon, he went to Professor Zulu's Lab. Since Bash is Professor Zulu's favourite student, Zulu allows him to take as many Pokemon from his lab as he pleases.

But Zulu warns him that a group of k > 1 Pokemon with strengths {s1, s2, s3, ..., sk} tend
to fight among each other ifgcd(s1, s2, s3, ..., sk) = 1 (see
notes for gcd definition).

Bash, being smart, does not want his Pokemon to fight among each other. However, he also wants to maximize the number of Pokemon he takes from the lab. Can you help Bash find out the maximum number of Pokemon he can take?

Note: A Pokemon cannot fight with itself.

Input

The input consists of two lines.

The first line contains an integer n (1 ≤ n ≤ 105),
the number of Pokemon in the lab.

The next line contains n space separated integers, where the i-th
of them denotes si (1 ≤ si ≤ 105),
the strength of the i-th Pokemon.

Output

Print single integer — the maximum number of Pokemons Bash can take.

Examples

input
3
2 3 4


output
2


input
5
2 3 4 6 7


output
3


Note

gcd (greatest common divisor) of positive integers set {a1, a2, ..., an} is
the maximum positive integer that divides all the integers{a1, a2, ..., an}.

In the first sample, we can take Pokemons with strengths {2, 4} since gcd(2, 4) = 2.

In the second sample, we can take Pokemons with strengths {2, 4, 6}, and there is no larger group with gcd ≠ 1.

Source

Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)

My Solution

题意:给出n个数,选出尽可能多的数,使这些数的gcd不是1.

数论+贪心

选出尽可能多的数,使这些数的gcd不是1.,则它们的gcd是x,x >= 2,

所以可以枚举gcd的值,从2到1e5,然后枚举倍数 j, x * j (x*j < 1e5)必定在x的集合里所以1<=j <=1e5 ,

即对于每个i 最多可以枚举j = 1e5 / i 个值i * j,故对于1e5 / x 从1 到1e5积分,得n*lin(n) 约等于 1e6

故复杂度 O(nln(n))

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL maxn = 1e5 + 8;

int cnt[maxn];

int main()
{
#ifdef LOCAL
freopen("b.txt", "r", stdin);
//freopen("b.out", "w", stdout);
int T = 4;
while(T--){
#endif // LOCAL
ios::sync_with_stdio(false); cin.tie(0);

int n, a;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a;
cnt[a]++;
}

LL i, j, k, ans = 1;
//直接 1e5/x从1到1e5积分等于1e6
for(i = 2; i < maxn; i++){
k = 0;
for(j = 1; j <= maxn; j++){
if(i * j < maxn){
k += cnt[i * j];
}
else break;
}
ans = max(ans, k);

}
cout << ans << endl;

#ifdef LOCAL
memset(cnt, 0, sizeof cnt);
cout << endl;
}
#endif // LOCAL
return 0;
}



  Thank you!

                                                                                                           
                                   ------from ProLights
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐