#48. [WPXCO 1.1 APR-CON] 春季赛题解

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: 2024-J-W010

题目描述

[WPXCO 1.1 APR-CON] 春季赛题解

T1:

斐波那契数列的奇偶性:奇、奇、偶、奇、奇、偶

于是考虑把 项数字分割成 个三元组,每个三元组中必定包含 个奇数,共有 个质数。

可能出现剩余,分类讨论:

  • 剩下第一个为奇数。
  • 剩下两个都为奇数。

于是,要在先前的结果加 ,即 个奇数。

:

大部分参赛者思路正确,但因为未取模 而获 分。

:

正确取模,思路正确,

程序:

#include <bits/stdc++.h>
using namespace std;

int main() {
	freopen("oved.in", "r", stdin);
	freopen("oved.out", "w", stdout);

	long long n;
	cin >> n;
	cout << ((n / 3 * 2) + n % 3) % 998244353;
}

T2:

:

根据 的性质,得到 ,在下面生成 的代码给你一个提示。

程序:

#include<bits/stdc++.h>
using namespace std;

int T, u, v, lca;
int main() {
	freopen("point.in", "r", stdin);
	freopen("point.out", "w", stdout);
	
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> T;
	for (int i = 1;i <= T;i ++) {
		cin >> u >> v >> lca;
		cout << u + v - 2 * lca << endl;
	}
	
	return 0;
}

T3:

:

因为 的范围,导致不能暴力枚举。实际上, 都存在一个性质:

这是两个 可重复贡献问题,考虑开 表分别进行求解。

需要注意的是本题代码有重复的地方,可以写完求 的表之后复制粘贴改成 ,调用时也是同理。

程序:

#include <bits/stdc++.h>
using namespace std;

int n, q, x, a, b, ans1, ans2, f1[50001][51], f2[50001][51];
int main() {
	freopen("determine.in", "r", stdin);
	freopen("determine.out", "w", stdout);
	scanf("%d%d", &n, &q);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		f1[i][0] = f2[i][0] = x;
	}

	for (int j = 1; 1 << j <= n; j++) {
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			f1[i][j] = max(f1[i][j - 1], f1[i + (1 << j - 1)][j - 1]);
			f2[i][j] = min(f2[i][j - 1], f2[i + (1 << j - 1)][j - 1]);
		}
	}
	
	for (int i = 1; i <= q; i++) {
		scanf("%d%d", &a, &b);
		if (a > b)
			swap(a, b);
		
		int k = log2(b - a + 1);
		ans1 = max(f1[a][k], f1[b - (1 << k) + 1][k]);
		ans2 = min(f2[a][k], f2[b - (1 << k) + 1][k]);
		printf("%d\n", ans1 - ans2);
	}
	
	return 0;
}

T4:

:

由于不考虑顺序,可以转化为求 ,这是一个标准的 定理,直接套用模板求解。

程序:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll a[100001];
int p;
ll pow(ll y, int z, int p) {
	y %= p;
	ll ans = 1;
	
	for (int i = z;i ;i >>= 1, y = y * y % p)
		if (i & 1)
			ans = ans * y % p;
	
	return ans;
}

ll C(ll n,ll m) {
	if (m > n)
		return 0;
	
	return ((a[n] * pow(a[m], p - 2, p)) % p * pow(a[n - m], p - 2, p) % p);
}

ll Lucas(ll n, ll m) {
	if (!m)
		return 1;
	
	return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}

inline int read(){
	int f=1,x=0;char ch;
	do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
	do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
	return f*x;
}

int main() {
	freopen("choosing.in", "r", stdin);
	freopen("choosing.out", "w", stdout);
	int T = read();
	while (T --) { 
		int n = read(), m = read();
		p = read();
		
		a[0] = 1;
		for (int i = 1;i <= p;i ++)
			a[i] = (a[i - 1] * i) % p;
		
		cout<< Lucas(n + m, n) << endl;
	}
}

输入格式

输出格式

输出 代表你看过这篇题解

样例

数据范围与提示