A骰子魔术
这个题考察的是非常基本的数组遍历,只需要依次遍历数组每个元素,看有没有值为x的元素即可
代码如下:
#include<iostream>
using namespace std;
int arr[1001];
int main() {
int n, x, flag = 0;
cin >> n >> x;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
if (arr[i] == x) flag = 1;
}
cout << (flag ? "YES" : "NO") << endl;
return 0;
}
B最少剩几个
这道题乍一看似乎没什么思路,但是仔细观察会发现,题目中能删除的只有这么几种情况:
1.奇数 X 奇数 == 奇数
2.奇数 + 偶数 == 奇数
那么我们可以遍历数组,把奇数个数和偶数个数统计出来,先把奇数偶数一对一消除,也就是利用性质2,然后如果剩下的是奇数,那么我们就看剩下的奇数个数是不是奇数,如果是奇数证明有一个奇数我们是消不掉的,如果是偶数我们就可以一对一对地全部删掉;反之如果剩下的是偶数,那么我们没办法删除任何数字,也就是剩下的偶数全部不能删除。
细节看代码:
#include<iostream>
using namespace std;
const int MAXN = 1e5 + 5;
int arr[MAXN];
int main() {
int n;
int odd = 0, even = 0;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
if (arr[i] % 2 == 0) even += 1;
else odd += 1;
}
int ans = min(even, odd) * 2;
if (even >= odd) {
cout << n - ans << endl;
} else {
int cnt = odd - even;
cout << (cnt % 2 == 0 ? 0 : 1) << endl;
}
return 0;
}
C两个函数
此题乍一看好像是递归,但是其实会发现它们两个函数并没有任何转移或者递进的关系,所以分类讨论即可,对于x == 1的情况并不复杂,我们着重讨论x > 1的情况:
关于这个求和公式,我们可以一步一步把式子拆开来看:
其中因为数据很大需要取模,我们在过程中注意取模的地方即可,有一点就是取模操作和除法操作没有分配律,所以我们需要特别注意这个地方,不能边除边取模。
具体代码如下:
#include<iostream>
using namespace std;
typedef long long LL;
const LL MOD = 998244353;
#define MUL(VAL) ((VAL) * (VAL) % MOD)
LL f(LL a, LL x) { return a * x % MOD; }
LL getSum(LL a, LL x) { return ((x - 1) * x / 2) % MOD; }
LL solve() {
LL a, x;
cin >> a >> x;
if (x == 1) {
return f(a, x);
}
return MUL(a) * getSum(a, x) % MOD;
}
int main() {
int q;
cin >> q;
while (q--) {
cout << solve() << endl;
}
return 0;
}