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
output
input
output
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
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
相关文章推荐
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C. Felicity is Coming! 哈希
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B - Bash's Big Day 枚举
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) A
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) -- B. Bash's Big Day (唯一分解定理)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) -- C. Felicity is Coming! (STL水过)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)A+B
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) A. Gotta Catch Em' All!(水题)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B. Bash's Big Day(分拆素因子+求最多的公因子)
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C - Felicity is Coming!
- 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) B】 Conan and Agasa play a Card Game
- 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) D】Bash and a Tough Math Puzzle
- 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C】 Travelling Salesman and Special Numbers
- Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C】 Travelling Salesman and Specia
- CodeCraft-18 and Codeforces Round #458(Div. 1+Div. 2,combined)
- Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) E. Palindromes in a Tree(点分治)