闲话
晚上在外面逛了几圈
所以今天的闲话发得比较的晚
感觉生活水平需要提升于是在找游戏人生的壁纸(
所以有好心人投喂几张吗(
今日模拟赛有交互题
“不保证评测交互库和下发交互库相同”
然后可以直接调用交互库里的函数
连namespace的名称都没改
连变量名都没改
三行就能ac是吧
[今天脑内循环的还是Aster 很推荐去看看!]
[霓虹的世界……]
杂题
好在我还留了一道题没写
要不然没东西可写了(
定义 \(N\) 的整数拆分为满足 \(\sum_{i=1}^n a_i = N \text{ s.t. } a_i > 0\) 的有序序列 \(a_i\)。定义一个 \(N\) 的整数拆分 \(a_i\) 的权值为 \(\prod_{i=1}^n F_{a_i}\),其中 \(F_i\) 为斐波那契数列,满足 \(F_0 = 0, F_1 = 1, F_i = F_{i-1} + F_{i-2}\)。
给定 \(N\),求其整数拆分权值之和对 \(10^9+7\) 取模的值。
\(N \le 10^{10000}\)。
某人无意识中出了这题的弱化版。所以写了。
通过长时间的研究我们发现了计算对于 \(n\) 的整数拆分的总数有一个很简单的递推式,但是因为这个递推式实在太简单了,如果出这样的题目,大家会对比赛毫无兴趣的。
- 来自题面
其实确实。
我们考虑先生成这个 \(n\) 的整数拆分的总数。假设 \([x^n]F(x)\) 为答案,不难发现我们可以将其拆分为由 \(i\) 个整数生成的方案数的总和。当前是由全体正整数生成,因此立得
\[F(x) = \sum_{i=0}^{\infty} \left(\frac 1{1-x}\right) ^ i = \frac{1}{1 - \frac{1}{1-x}} \]然后自然推广得到假设用数列 \(G(x)\) 来取 \(n\) 的拆分数,若 \([x^n]F(x)\) 为答案则有
\[F(x) = \frac 1{1-G(x)} \]回到题目。由斐波那契数列的递推式不难得到斐波那契数列的生成函数
\[G(x) = \frac{x}{1 - x - x^2} \]因此有答案数列
\[F(x) = \frac 1{1-G(x)} = \frac{1 - x - x^2} {1-2x-x^2} \]到这里有两种做法(
1. 直接做
我们不难得到分母 \(\frac 1 {1 - 2x - x^2}\) 对应数列 \(a_i\) 的递推式:
\[a_n = 2a_{n-1} + a_{n-2} \]考虑分子的贡献:
\[a_{ans} = a_n - a_{n-1} - a_{n-2} = a_{n-1} \]因此得到答案的递推式,直接做矩乘就是 \(O(\log n)\) 的。但是还可以接着推。
考虑斐波那契数列通项公式的求法。我们设 \(a_n = pa_{n-1}\),得到
\[p^2 a_{n-2} - 2pa_{n-2} - a_{n-2} = 0 \]解得
\[p = 1\pm \sqrt 2 \]直接设
\[a_n = c_1(1 - \sqrt 2) ^n + c_2(1 + \sqrt 2)^n \]带入特值能得到
\[\begin {aligned}\left\{\begin {aligned}c_1 = \frac{\sqrt 2 - 1}{2\sqrt 2} \\ c_2 = \frac{\sqrt 2 + 1}{2 \sqrt 2}\end{aligned}\right.\end{aligned} \]整理得到
\[a_n = \frac {\sqrt 2} 4\left( (1+ \sqrt 2)^{n+1} - (1 - \sqrt 2)^{n+1} \right) \]考虑 \(x^2 \equiv 2 \pmod{10^9 + 7}\) 的解。扔进什么板子里能得到 \(x =59713600\)。带入计算就可以 \(O(\log n)\) 求解。
答案减一即可。
2. 部分分式分解
\[\frac{1 - x - x^2} {1-2x-x^2} = 1 + \frac{x} {1-2x-x^2} \]根据部分分式定理,考虑待定系数得到
\[\frac{x} {1-2x-x^2} = \frac A{1 - px} + \frac B{1-qx} = \frac{(A+B) + (Aq + bP) x}{1 - (p+q)x + pqx^2} \]然后就是一通对比系数。这部分是 dirty work,总而言之我们能得到
\[\frac{x} {1-2x-x^2} = \frac {\sqrt 2}4 \left( \frac {1}{1 - (1 + \sqrt 2)x} - \frac{1}{1 - (1 - \sqrt 2)x} \right) \]化简可以得到和 1. 相同的结论。
于是我们得到了递推式。在读入时将 \(n\) 对 \(10^9 + 6\) 取模即可。
code
#include <bits/stdc++.h>
using namespace std;
#define int long long
#ifdef ONLINE_JUDGE
char buf[1<<21], *p1 = buf, *p2 = buf; inline char getc() { return (p1 == p2 and (p2 = (p1 = buf) + fread(buf, 1, 1<<21, stdin), p1 == p2) ? EOF : *p1++); }
#define getchar getc
#endif
#define rep(i,a,b) for (register int i = (a), i##_ = (b) + 1; i < i##_; ++i)
#define pre(i,a,b) for (register int i = (a), i##_ = (b) - 1; i > i##_; --i)
const int mod = 1e9 + 7, phi_m = mod - 1, sqrt_2 = 59713600;
int n;
int qp(int a, int b) { int ret = 1; for (; b; a = 1ll * a * a % mod, b >>= 1) if (b & 1) ret = 1ll * ret * a % mod; return ret; }
signed main() {
char c; while (isdigit(c = getchar())) n = (1ll * n * 10 + c - '0') % phi_m;
cout << 1ll * sqrt_2 * 250000002 % mod * (qp(sqrt_2 + 1, n) - qp(1 - sqrt_2 + mod, n) + mod) % mod;
}