题解 P9885 / QOJ6126【[Qingdao18A] Sequence and Sequence】
题解 P9885 / QOJ6126【[Qingdao18A] Sequence and Sequence】
具体数学还在发力!
题目描述
考虑下列两个序列
- 序列
是一个已排序的序列,其中,对于所有 , 在序列 中出现 次( 为正整数集)。也就是说, - 序列
可以由以下方程导出:
也就是说,
给定一个正整数
输入格式
本题的测试点包含多组测试数据。
第一行输入包含一个整数
- 第一行(也是唯一一行)包含一个整数
( )。
输出格式
对于每组测试数据,输出一行,包含一个整数,表示
1. Abel 分部求和公式
因为左式
等于右式。这里我们默认
2. 从有限微积分出发的分部求和
准备应用
记
发现十分神经病。我们重定义一下,
给我个符号,就用
这样也可以重新定义
分部求和可以重新写一遍:
刚才说的东西
现在就能对起来了!
3. 题解
诱人的是
令
令
取出右边和式:注意
最后一步由定义得到。所以记
其中
因为
4. 代码实现
实现比较困难,第一是高精度,这个直接使用板子(强烈推荐 封装 BigInt 的伟大计划 - 洛谷专栏、剪贴板直达)就算了,真考了就写 python。
第二是
考虑使用 python3 的 sympy 库(正赛没有这个库可以用),具体用法你自己问 AI,反正能写出来个这东西:
#!/bin/env python3
import sympy
x = sympy.Symbol('x')
i = sympy.Symbol('i')
def presum(f):
return sympy.Sum(f.subs(x, i), (i, 1, x)).doit().simplify()
def uplevel(F):
return F.subs(x, x * (x + 1) / 2 - 1).simplify()
Subs
函数就是函数复合,f.subs(x, i)
将 F.subs(x, x * (x + 1) / 2 - 1)
就是 Sum
就是求和,看格式,然后 simplify
就是化简(但实际上简单不了多少,也可以换成 expand
或者 factor
)。然后就可以 print
出来:
def trans(F):
return presum(uplevel(F))
def trans2(f):
return uplevel(presum(f))
f = x # 大 F
print(f)
print(trans(f))
print(trans(trans(f)))
print(trans(trans(trans(f))))
# print(trans(trans(trans(trans(f)))))
f = x - x + 1 # 小 f,注意可能有一点神经,需要指定一下未知的元
print(f)
print(trans2(f))
print(trans2(trans2(f)))
print(trans2(trans2(trans2(f))))
# print(trans2(trans2(trans2(trans2(f)))))
然后要粘贴到 C++ 里面,需要把 python 的 **
幂运算去掉。mint
是我们的高精度类型。
def custom_print(expr):
s = str(expr.factor()) # 推荐输出前 factor(因式分解)
for i in range(100, 1, -1):
s = s.replace(f'x**{i}', '*'.join(['x'] * i))
print(f'+[](mint x) -> mint {{ return {s}; }},')
将 print
全部换成 custom_print
。
输出如下:
+[](mint x) -> mint { return x; },
+[](mint x) -> mint { return x*(x - 1)*(x + 4)/6; },
+[](mint x) -> mint { return x*(x - 1)*(5*x*x*x*x*x + 40*x*x*x*x + 131*x*x*x + 236*x*x - 44*x - 1024)/1680; },
+[](mint x) -> mint { return x*(x - 1)*(x + 4)*(429*x*x*x*x*x*x*x*x*x*x*x*x + 5148*x*x*x*x*x*x*x*x*x*x*x + 26697*x*x*x*x*x*x*x*x*x*x + 75636*x*x*x*x*x*x*x*x*x + 122031*x*x*x*x*x*x*x*x + 89604*x*x*x*x*x*x*x - 37373*x*x*x*x*x*x - 205140*x*x*x*x*x - 1140248*x*x*x*x - 4246656*x*x*x - 8781968*x*x - 10100160*x + 41554944)/276756480; },
+[](mint x) -> mint { return 1; },
+[](mint x) -> mint { return (x - 1)*(x + 2)/2; },
+[](mint x) -> mint { return (x - 1)*(x + 2)*(x*x + x - 4)*(x*x + x + 6)/48; },
+[](mint x) -> mint { return (x - 1)*(x + 2)*(x*x + x - 4)*(5*x*x*x*x*x*x*x*x*x*x + 25*x*x*x*x*x*x*x*x*x + 80*x*x*x*x*x*x*x*x + 170*x*x*x*x*x*x*x + 289*x*x*x*x*x*x + 377*x*x*x*x*x + 546*x*x*x*x + 612*x*x*x - 3864*x*x - 4128*x - 26880)/215040; },
+[](mint x) -> mint { return 1; }
是一个转型为函数指针的 Lambda 对象,其类型为 mint (*)(mint)
。于是就可以将这
其它的代码不需要我教你怎么写了吧!
code
#include <bits/stdc++.h>
using namespace std;
#ifdef local
#define debug(...) fprintf(stderr, ##__va_args__)
#else
#define endl "\n"
#define debug(...) void(0)
#endif
// 省略一个高精度板子,见上
using mint = BigInt<9>;
mint operator*(int x, mint y) { return y * x; }
using LL = long long;
using FuncPtr = mint (*)(mint);
const FuncPtr F[] = {/*{{{*/
/* 四个函数 */
}; /*}}}*/
const FuncPtr f[] = {/*{{{*/
/* 四个函数 */
};/*}}}*/
constexpr int L = 1e6, N = L + 10;
mint q[N], preq[4][N];
int p[N];
mint P(mint n) {
mint l = 0, r = mint(1) << (mint::n * 16 - 2), ans = 0;
while (l <= r) {
mint mid = (l + r) >> 1;
if ((mid * (mid + 1) >> 1) <= n)
ans = mid, l = mid + 1;
else
r = mid - 1;
}
return ans;
}
mint ns[110];
mint g(int c, int d) {
if (ns[c] <= L) return preq[d][(int)ns[c]];
return F[d](ns[c]) * g(c + 1, 0) - g(c + 1, d + 1);
}
int main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
#endif
q[1] = 1, p[1] = 1;
int lst = 1;
for (int i = 2; i <= L; i++) {
if ((lst + 1) * (lst + 2) / 2 == i) ++lst;
p[i] = lst;
q[i] = q[i - 1] + q[lst];
}
for (int j = 0; j < 4; j++) {
for (int i = 1; i <= L; i++) {
preq[j][i] = preq[j][i - 1] + f[j](i) * q[p[i]];
}
}
int t;
cin >> t;
while (t--) {
cin >> ns[0];
for (int i = 1; i <= 4; i++) ns[i] = P(ns[i - 1]);
cout << g(0, 0) << endl;
}
return 0;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18628668/solution-P9885
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!