diff --git a/P15569.cpp b/P15569.cpp new file mode 100644 index 0000000..05b73b4 --- /dev/null +++ b/P15569.cpp @@ -0,0 +1,88 @@ +#include +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 三种 +*/ \ No newline at end of file diff --git a/P15569.md b/P15569.md new file mode 100644 index 0000000..5e28c7f --- /dev/null +++ b/P15569.md @@ -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$ | 无额外限制 | \ No newline at end of file