Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
255e8aad86 | ||
|
|
ab24911b50 | ||
|
|
a3a5747859 |
No files matched your search
+36
@@ -0,0 +1,36 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
const int mod = 998244353;
|
||||
int t, n, a[8005], nxt[8005];
|
||||
long long f[8005];
|
||||
int main() {
|
||||
scanf("%d", &t);
|
||||
while (t--) {
|
||||
scanf("%d", &n);
|
||||
for (int i = 1; i <= n; i++)
|
||||
scanf("%d", &a[i]);
|
||||
f[0] = 1;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
int k = i + 1;
|
||||
for (int j = 0; j <= i; j++)
|
||||
nxt[j] = i + 1;
|
||||
for (int j = i - 1; j >= 1; j--) {
|
||||
while (k != i + 1 && a[k - 1] != a[j])
|
||||
k = nxt[k];
|
||||
if (a[k - 1] == a[j])
|
||||
k--;
|
||||
nxt[j] = k;
|
||||
}
|
||||
for (int j = i - 1; j >= 0; j--)
|
||||
if (nxt[j + 1] == i + 1)
|
||||
f[i] = (f[i] + f[j]) % mod;
|
||||
}
|
||||
printf("%lld\n", f[n]);
|
||||
memset(f, 0, sizeof(f[0]) * (n + 1));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
KMP
|
||||
ABA.rev = A.rev + B.rev + A.rev
|
||||
*/
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
# CF2205E Simons and Dividing the Rhythm
|
||||
|
||||
## 题目描述
|
||||
|
||||
我紧握手中的烦恼,然后将它们抛向千里之外。
|
||||
|
||||
—— SHUN,《ONMYWAY》
|
||||
|
||||
假设 Simons 有一个长度为 $m$ 的数组 $a$。
|
||||
|
||||
Simons 需要对该数组执行如下操作,且仅能执行一次:
|
||||
|
||||
- 首先,他需要选择一个整数 $k$,并选定 $k$ 对整数 $[l_1, r_1], [l_2, r_2], \ldots, [l_k, r_k]$,使得:
|
||||
- 对每个 $1\le i\le k$,都有 $l_i\le r_i$;
|
||||
- $l_1=1$,$r_k=m$;
|
||||
- 对每个 $i$($1 \leq i < k$),$r_i+1=l_{i+1}$。
|
||||
- 然后,他分别将每个子数组 $[a_{l_i}, a_{l_i+1},\ldots, a_{r_i}]$ 独立地进行翻转。操作后,数组会变成 $[a_{r_1}, a_{r_1-1},\ldots, a_{l_1}, a_{r_2}, \ldots, a_{l_{k-1}}, a_{r_k}, a_{r_k-1}, \ldots, a_{l_k}]$。
|
||||
|
||||
现给定一个长度为 $n$ 的数组 $T$。请你统计有多少个数组 $S$,经过 Simons 执行如上的一次操作后,可以变换为 $T$。答案对 $998\,244\,353$ 取模。
|
||||
|
||||
## 输入格式
|
||||
|
||||
每组测试包含若干测试用例。第一行包含整数 $t$($1 \le t \le 8000$),表示测试用例的数量。
|
||||
|
||||
接下来每组测试包含:
|
||||
|
||||
第一行是一个整数 $n$($1 \le n \le 8000$),表示 $T$ 的长度。
|
||||
|
||||
第二行有 $n$ 个整数 $T_1, T_2, \ldots, T_n$($1\le T_i \le 8000$),表示数组 $T$ 的元素。
|
||||
|
||||
保证所有测试用例中 $n$ 的总和不超过 $8000$。
|
||||
|
||||
## 输出格式
|
||||
|
||||
对于每个测试用例,输出一个整数,表示满足条件的数组 $S$ 的数量,答案对 $998\,244\,353$ 取模。
|
||||
|
||||
## 输入输出样例 #1
|
||||
|
||||
### 输入 #1
|
||||
|
||||
```
|
||||
5
|
||||
4
|
||||
1 1 2 1
|
||||
4
|
||||
1 2 3 1
|
||||
6
|
||||
1 3 2 3 3 2
|
||||
10
|
||||
2 3 1 4 3 1 4 3 1 2
|
||||
1
|
||||
8000
|
||||
```
|
||||
|
||||
### 输出 #1
|
||||
|
||||
```
|
||||
4
|
||||
7
|
||||
22
|
||||
383
|
||||
1
|
||||
```
|
||||
|
||||
## 说明/提示
|
||||
|
||||
对于第一个测试用例,只有如下几种数组能够被变换为 $T$:
|
||||
|
||||
- 对于 $S=[2,1,1,1]$,Simons 选择 $[1,3]$ 和 $[4,4]$,操作后数组变为 $[1,1,2,1]$,等于 $T$。
|
||||
- 对于 $S=[1,2,1,1]$,Simons 选择 $[1,4]$。
|
||||
- 对于 $S=[1,1,2,1]$,Simons 选择 $[1,2]$、$[3,3]$ 和 $[4,4]$。
|
||||
- 对于 $S=[1,1,1,2]$,Simons 选择 $[1,2]$ 和 $[3,4]$。
|
||||
|
||||
对于第二个测试用例,只有如下几种数组能够被变换为 $T$:
|
||||
|
||||
- 对于 $S=[1,1,3,2]$,Simons 选择 $[1,1]$ 和 $[2,4]$。
|
||||
- 对于 $S=[1,2,1,3]$,Simons 选择 $[1,1]$、$[2,2]$ 和 $[3,4]$。
|
||||
- 对于 $S=[1,2,3,1]$,Simons 选择 $[1,1]$、$[2,2]$、$[3,3]$ 和 $[4,4]$。
|
||||
- 对于 $S=[1,3,2,1]$,Simons 选择 $[1,4]$。
|
||||
- 对于 $S=[2,1,1,3]$,Simons 选择 $[1,2]$ 和 $[3,4]$。
|
||||
- 对于 $S=[2,1,3,1]$,Simons 选择 $[1,2]$、$[3,3]$ 和 $[4,4]$。
|
||||
- 对于 $S=[3,2,1,1]$,Simons 选择 $[1,3]$ 和 $[4,4]$。
|
||||
|
||||
由 ChatGPT 5 翻译
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
const int mod = 1e9 + 7;
|
||||
int n, k;
|
||||
namespace mat {
|
||||
struct Mat {
|
||||
long long a[3][3];
|
||||
int n, m;
|
||||
Mat(int _n = 0, int _m = 0) : n(_n), m(_m) { memset(a, 0, sizeof(a)); }
|
||||
void operator*=(const Mat &b) {
|
||||
if (m != b.n) {
|
||||
exit(-1);
|
||||
}
|
||||
long long res[105][105] = {};
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
for (int j = 1; j <= b.m; ++j) {
|
||||
for (int k = 1; k <= m; ++k) {
|
||||
res[i][j] = (res[i][j] + a[i][k] * b.a[k][j]) % mod;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
for (int j = 1; j <= b.m; ++j) {
|
||||
a[i][j] = res[i][j];
|
||||
}
|
||||
}
|
||||
m = b.m;
|
||||
}
|
||||
};
|
||||
Mat qpow(Mat a, long long k) {
|
||||
Mat res(a.n, a.n);
|
||||
for (int i = 1; i <= a.n; ++i) {
|
||||
res.a[i][i] = 1;
|
||||
}
|
||||
while (k) {
|
||||
if (k & 1)
|
||||
res *= a;
|
||||
a *= a;
|
||||
k >>= 1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
long long f(int n) {
|
||||
if (n <= 1) {
|
||||
return 1;
|
||||
}
|
||||
Mat base1(1, 2), base2(2, 2);
|
||||
base1.a[1][1] = 1;
|
||||
base1.a[1][2] = 1;
|
||||
base2.a[1][1] = 1;
|
||||
base2.a[1][2] = 1;
|
||||
base2.a[2][1] = 1;
|
||||
base2.a[2][2] = 0;
|
||||
base2 = mat::qpow(base2, n - 1);
|
||||
base1 *= base2;
|
||||
return base1.a[1][1];
|
||||
}
|
||||
} // namespace mat
|
||||
long long qpow(long long a, long long b) {
|
||||
a %= mod;
|
||||
long long res = 1;
|
||||
while (b) {
|
||||
if (b & 1)
|
||||
res = (res * a) % mod;
|
||||
a = (a * a) % mod;
|
||||
b >>= 1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
long long ni(int a) { return qpow(a, mod - 2); }
|
||||
int main() {
|
||||
scanf("%d%d", &n, &k);
|
||||
if (k < n) {
|
||||
printf("0\n");
|
||||
return 0;
|
||||
}
|
||||
long long all = qpow(k, n);
|
||||
long long correct = mat::f(n);
|
||||
printf("%lld\n", (correct * ni(all)) % mod);
|
||||
// printf("%lld\n", mat::f(n + 1));
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
排列
|
||||
0 <= ai + i - n <= 2
|
||||
n - i <= ai <= 2 + n - i
|
||||
只能取 n - i, n - i + 1, n - i + 2 三种
|
||||
*/
|
||||
@@ -0,0 +1,88 @@
|
||||
# P15569 [COCI 2025/2026 #5] 结构 / Struktura
|
||||
|
||||
## 题目背景
|
||||
|
||||
本题满分 $110$。
|
||||
|
||||
## 题目描述
|
||||
|
||||
Petar 和 Ivana 在漫长的冬日下午感到无聊,于是发明了一个数字游戏。
|
||||
|
||||
Petar 在纸上随机写下 $n$ 个数,每个数都**独立地、等概率地**从 $1$ 到 $k$ 之间选择,形成数组 $a$。
|
||||
|
||||
Ivana 说她特别喜欢某些数组,因为它们有一种“隐藏的平衡”,她称这种数组为**结构(structure)**。当且仅当满足以下条件时,数组 $a$ 是结构:
|
||||
|
||||
- 整数 $1,2,\dots,n$ 在数组中各出现恰好一次。
|
||||
- 对每个下标 $i$($1 \le i \le n$),都有 $|a_i + i - n - 1| \le 1$。
|
||||
|
||||
Ivana 想知道:Petar 完全随机生成数组 $a$ 时,得到结构的概率是多少。
|
||||
|
||||
可以证明答案总能表示为分数 $\dfrac{P}{Q}$,其中 $P$ 为整数,$Q$ 为正整数且不被 $10^9+7$ 整除。
|
||||
|
||||
## 输入格式
|
||||
|
||||
输入一行两个自然数 $n,k$($1 \le n,k \le 10^9$)。
|
||||
|
||||
## 输出格式
|
||||
|
||||
输出一个整数,表示所求概率在模 $10^9+7$ 意义下的值。
|
||||
|
||||
## 输入输出样例 #1
|
||||
|
||||
### 输入 #1
|
||||
|
||||
```
|
||||
2 1
|
||||
```
|
||||
|
||||
### 输出 #1
|
||||
|
||||
```
|
||||
0
|
||||
```
|
||||
|
||||
## 输入输出样例 #2
|
||||
|
||||
### 输入 #2
|
||||
|
||||
```
|
||||
2 2
|
||||
```
|
||||
|
||||
### 输出 #2
|
||||
|
||||
```
|
||||
500000004
|
||||
```
|
||||
|
||||
## 输入输出样例 #3
|
||||
|
||||
### 输入 #3
|
||||
|
||||
```
|
||||
7 94
|
||||
```
|
||||
|
||||
### 输出 #3
|
||||
|
||||
```
|
||||
100976822
|
||||
```
|
||||
|
||||
## 说明/提示
|
||||
|
||||
#### 【样例解释】
|
||||
|
||||
样例 #2 解释:
|
||||
|
||||
Petar 可能写出的数组共有 $2^2=4$ 个:$(1,1),(1,2),(2,1),(2,2)$。其中结构是 $(1,2)$ 与 $(2,1)$,概率为 $\dfrac{2}{4}$,因此输出 $2 \cdot 4^{-1} \bmod (10^9+7)=500000004$。
|
||||
|
||||
#### 【子任务】
|
||||
|
||||
| 子任务 | 分值 | 限制 |
|
||||
| :----: | :--: | :--: |
|
||||
| $1$ | $17$ | $n,k \le 7$ |
|
||||
| $2$ | $23$ | $n \le 7$,$k \le 100$ |
|
||||
| $3$ | $19$ | $n \le 20$,$k \le 100$ |
|
||||
| $4$ | $25$ | $n,k \le 10^6$ |
|
||||
| $5$ | $26$ | 无额外限制 |
|
||||
Reference in new issue
Block a user