链接:Codeforces Round #636 (Div. 3)
A - Candies
题意:求出一个x满足x+2∗x+4∗x+⋯+2k−1∗x=n且k>1
思路:提出x得x∗(1+2+4+⋯+2k−1)=n,从小到大枚举k,直到满足n∣(1+2+4+⋯+2k−1)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int T, n;
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
int now = 3, t = 4;
while (0 != n % now) {
now += t;
t *= 2;
}
printf("%d\n", n / now);
}
return 0;
}
B - Balanced Array
题意:给你一个偶数n,要求你构造出一个数列,满足前n2个数为偶数,后n2个数为奇数,每个数都为互不相同的正整数,且前n2个数的和等于后n2个数的和
思路:奇数和偶数的差为奇数,如果n2−1为奇数,那么对于前n2−1对奇数和偶数,合起来的差为偶数,那么第n2对奇数和偶数就无法构造出来,所以n2必须为偶数,即n∣4,显然可以构造出这样的数列2 4 6⋯n 1 3 5⋯(n−3) (n+n2−1)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int T, n;
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
if (n % 4) {
printf("NO\n");
continue;
}
printf("YES\n");
for (int i = 1; i <= n / 2; i++) printf("%d ", 2 * i);
for (int i = 1; i <= n / 2 - 1; i++) printf("%d ", 2 * i - 1);
printf("%d\n", n + n / 2 - 1);
}
return 0;
}
C - Alternating Subsequence
题意:就是给你n个数,你需要找出其中的最长子序列,并且这个子序列是正负交替的,并且尽量让这个子序列的和最大
思路:由于要子序列最长,所以把n个数按照正负分成几块(块内元素正负性相同),然后再在每个块内贪心取一个数即可
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace st