比赛链接:Codeforces Round #651 (Div. 2)
目录
比赛链接:Codeforces Round #651 (Div. 2)
A. Maximum GCD
题意:给定一个N,问1~N中若选出一对数,使得这对数的GCD最大,GCD是多少。
思路:GCD(N - (N&1),N/2)必定最大。
AC代码:
/*---------------------------------
*File name: A.cpp
*Creation date: 2020-06-20 22:22
*Link:
*-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;
int main(){
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
printf("%d\n", n / 2);
}
return 0;
}
B. GCD Compression
题意:给定一个长度为2 * N的数组A,问能否选出一个长度为2N-2的子序列使得子序列的GCD>1。
思路:偶数+偶数= 偶数, 奇数+ 奇数= 偶数,所以只需要选出N-1对奇偶性相同的数就可以。
AC代码:
/*---------------------------------
*File name: B.cpp
*Creation date: 2020-06-20 22:57
*Link:
*-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue
using namespace std;
const double EPS = 1e-8;
const int MaxN = 1e4 + 10;
const int maxn = 5e5 + 5;
const long long Inf = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const long long mod = 998244353;
int t , n , m , x ;
int main(){
scanf("%d", &t);
while(t--){
scanf("%d",&n);
vector<int> odd , even ;
for(int i = 1 ; i <= 2 * n ; ++i){
scanf("%d",&x);
if(x & 1) odd.pb(i);
else even.push_back(i);
}
int o, k, e;
o = k = e = 0;
int p = n - 1;
int Sizee = even.size();
int Sizeo = odd.size();
while(k < p){
++k ;
if(e + 1 < Sizee){
printf("%d %d\n",even[e],even[e + 1]);
e += 2;
}
else if(o + 1 < Sizeo){
printf("%d %d\n",odd[o],odd[o + 1]);
o += 2;
}
}
}
return 0;
}
C. Number Game
题意:给定一个N,两人轮流对N操作,每次可以有两种选择:第一种是当N > 1时,将N -= 1,第二种是将N /= Fac, Fac为N的不为1的奇因子,两人谁先把N置为1谁获胜。
思路:如果N是奇数,N/N=1,先手获胜,排除N=1的情况;如果N是2,先手获胜。除去这两种情况后,当N是偶数时,将N质因子分解,如果只有2是因子,则后手获胜,因为只能进行第二种操作。如果不止2为因子,则可以直接将所有非2因子除去,只剩下2因子或一个2因子都不剩,再判断就可以了。
AC代码:
/*---------------------------------
*File name: A.cpp
*Creation date: 2020-06-20 23:38
*Link:
*-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;
int n , k , t;
vector<int> p(33, 0);
int main(){
p[0] = 1;
for(int i = 1 ; i <= 30 ; ++i) p[i] = 2 * p[i - 1];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n == 1) puts("FastestFinger");
else if(n & 1)puts("Ashishgup");
else if(n == 2) printf("Ashishgup\n");
else{
bool flag = false;
int cnt = 0 ;
int N = n;
while(n % 2 == 0){
cnt++;
n /= 2;
}
int tot = 0 ;
for(int i = 2 ; i * i <= n ; ++i){
if(n % i) continue;
while(n % i == 0){
n /= i ;
tot++;
}
}
if(n != 1) tot++;
if(p[cnt] == N) flag = true;
if(flag) printf("FastestFinger\n");
else{
if((tot > 1 && p[cnt] == 2) ||(p[cnt] != 2))printf("Ashishgup\n");
else cout << "FastestFinger" << endl;
}
}
}
return 0;
}
D. Odd-Even Subsequence
题意:给定一个长度为N的数组A以及一个K,问能否选出一个长度为K的子序列,使得子序列的下面这个式子的值尽量小。
思路:傻逼二分题,直接二分答案,分两次On分别判断能不能在偶数位置或者奇数位置上选出的数都<=x。
AC代码:
/*---------------------------------
*File name: D.cpp
*Creation date: 2020-06-21 12:11
*Link:
*-------------------------------*/
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int>
#define Pque priority_queue
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const double EPS = 1e-8;
vector<int> a;
bool check(int x, bool flag, int k){
for(int i = 0; i < a.size(); ++i){
if(k != 0){
if(flag) k--, flag ^= 1;
else{
if(a[i] <= x) k--, flag ^= 1;
}
}
else break;
}
return k == 0;
}
int main(){
int n, k;
scanf("%d %d", &n, &k);
a.resize(n);
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
int l = 1, r = inf;
int ans;
while(l <= r){
int mid = l + r >> 1;
if(check(mid, 0, k) || check(mid, 1, k)){
r = mid - 1;
ans = mid;
}
else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}