「JLOI2015」有意义的字符串

题意

给你 \(b, d, n\) 求

\[[(\frac{b + \sqrt d}2)^n] \mod 7528443412579576937
\]

\(0 < b^2 \le d < (b + 1)^2 \le 10^{18}, n \le 10^{18}\) 且 \(b \bmod 2 = 1, d \bmod 4 = 1\)

题解

我们把形式如果凑成

\[f(n) = (\frac{b + \sqrt d}2)^n + (\frac{b - \sqrt d} 2)^n
\]

不难发现这是一个二阶常系数线性递推式的通项公式。

也就是有

\[f(n) = c_1f(n - 1) + c_2f(n - 2)
\]

我不太会特征方程求通项公式,打了下表。。不难发现就是

\[\begin{cases}
c_1 = b\\
\displaystyle c_2 = \frac{d - b^2}4
\end{cases}
\]

注意 \(f(0) = 1, f(1) = c_1, f(2) = c_1^2 +c_2 \times 2\) ,特判掉就行了。

但我们要求得答案是

\[g(n) = [f(n) - (\frac{b - \sqrt d}2)^n]
\]

不难发现,当 \(b \not = d^2\) 且 \(n > 2, n \bmod 2 = 0\) 的时候答案会少 \(1\) 。(打表发现的QAQ)

用矩阵快速幂处理即可,模数很垃圾开个 __int128 就好了,复杂度是 \(O(\log n)\) 的。

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl using namespace std; using ll = long long; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } void File() {
#ifdef zjp_shadow
freopen ("2106.in", "r", stdin);
freopen ("2106.out", "w", stdout);
#endif
} const ll Mod = 7528443412579576937; struct Matrix { ll a[2][2]; void Init() { Set(a, 0); } void Unit() { Rep (i, 2) Rep (j, 2) a[i][j] = (i == j); } inline Matrix friend operator * (const Matrix &lhs, const Matrix &rhs) {
Matrix res; res.Init();
Rep (i, 2) Rep (k, 2) Rep (j, 2)
res.a[i][j] = (res.a[i][j] + (__int128)(lhs.a[i][k]) * rhs.a[k][j]) % Mod;
return res;
} }; ll b, d, n; Matrix fpm(Matrix x, ll power) {
Matrix res; res.Unit();
for (; power; power >>= 1, x = x * x)
if (power & 1) res = res * x;
return res;
} int main () { File(); cin >> b >> d >> n; if (n == 0) return puts("1"), 0; ll c1 = b, c2 = (d - b * b) / 4; Matrix Base = (Matrix) {c1, 0, (ll)((__int128(c1) * c1 + c2 * 2) % Mod), 0}, trans = (Matrix) {0, 1, c2, c1}; if (n == 1) return printf ("%lld\n", Base.a[0][0]), 0;
if (n == 2) return printf ("%lld\n", Base.a[1][0]), 0; Base = fpm(trans, n - 2) * Base;
cout << Base.a[1][0] - ((n & 1) || (d == b * b) ? 0 : 1) << endl; return 0; }

「JLOI2015」城池攻占

原来写过 题解 ,就不再说了。。

「JLOI2015」装备购买

题意

有 \(n\) 个物品,每个物品有代价 \(c_i\) ,和 \(m\) 个属性,用向量 \(\mathbf{z_i} = (a_1, \dots, a_m)\) 表示。

你要选出尽量多的物品,使得代价尽量小,且使得任意一个物品不能被其他任意的几个物品的线性组合表示出来。

\(1 \le n, m \le 500; 0 \le a_j \le 1000\)

题解

随意开开脑洞。

不难发现就是求尽量多的线性无关变量。

那么我们考虑把所有的物品按权值从小到大依次插入线性基就行了。

复杂度是 \(O(nm^2)\) 的。至于除法,可以考虑模意义下的,不用考虑精度了。

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl using namespace std; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("2108.in", "r", stdin);
freopen ("2108.out", "w", stdout);
#endif
} const int Mod = 998244353; inline int fpm(int x, int power) {
int res = 1;
for (; power; power >>= 1, x = 1ll * x * x % Mod)
if (power & 1) res = 1ll * res * x % Mod;
return res;
} const int N = 510; int n, m; struct Array {
int a[N], cost;
} T[N], Base[N]; int main () { File(); n = read(); m = read(); For (i, 1, n) For (j, 1, m) T[i].a[j] = read();
For (i, 1, n) T[i].cost = read(); sort(T + 1, T + n + 1, [&](Array lhs, Array rhs) { return lhs.cost < rhs.cost; }); int ans1 = 0, ans2 = 0; For (i, 1, n) {
bool flag = false;
For (j, 1, m) {
if (T[i].a[j]) {
if (!Base[j].a[j]) {
flag = true; Base[j] = T[i]; break;
}
else {
int coef = 1ll * fpm(Base[j].a[j], Mod - 2) * T[i].a[j] % Mod;
For (k, j, m)
T[i].a[k] = (T[i].a[k] - 1ll * Base[j].a[k] * coef) % Mod;
}
}
}
if (flag) ++ ans1, ans2 += T[i].cost;
} printf ("%d %d\n", ans1, ans2); return 0; }

JLOI2015 DAY1 简要题解的更多相关文章

  1. A · F · O —— JLOI2018翻车记(附Day1简要题解)

    JLOI2018翻车记 并不知道该怎么写... 算了还是按照标准剧情来吧 这应该是一篇写得非常差的流水账... 2018.04.04 Day -1 省选前在机房的最后一天. 压力并不是很大,毕竟联赛 ...

  2. JLOI2015 DAY2 简要题解

    「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...

  3. SCOI2016 Day1 简要题解

    目录 「SCOI2016」背单词 题意 题解 代码 「SCOI2016」幸运数字 题意 题解 总结 代码 「SCOI2016」萌萌哒 题意 题解 总结 代码 「SCOI2016」背单词 题意 这出题人 ...

  4. SCOI 2015 Day1 简要题解

    「SCOI2015」小凸玩矩阵 题意 一个 \(N \times M\)( $ N \leq M $ )的矩阵 $ A $,要求小凸从其中选出 $ N $ 个数,其中任意两个数字不能在同一行或同一列, ...

  5. [NOIP 2018 Day1] 简要题解

    [题目链接] 铺设道路 : https://www.luogu.org/problemnew/show/P5019 货币系统 : https://www.luogu.org/problemnew/sh ...

  6. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...

  7. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  8. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  9. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

随机推荐

  1. JavaScript对象访问器属性

    对象访问器就是setter和getter,他们的作用就是 提供另外一种方法来获取或者设置对象的属性值, 并且在获取和设置的时候,可以用一定的其他操作. 看下面代码: <script> va ...

  2. mysql常用命令行操作(一):登陆、退出、查看端口、修改密码、刷新

    一.登陆和退出mysql mysql -u root -p # 登陆exit # 退出 二.查看当前mysql的端口号 show global variables like 'port'; 三.查看用 ...

  3. HDU 2001 计算两点间的距离

    http://acm.hdu.edu.cn/showproblem.php?pid=2001 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离 ...

  4. mysql uuid() 相同 重复

    mysql select UPPER(REPLACE(uuid(),'-','')) from xxxtable 得到相同的uuid的问题 - LWJdear的博客 - CSDN博客 https:// ...

  5. 2 Servlet 细节

    1 Servlet 配置详解 ①  由于客户端在浏览器只能通过URL访问web服务器的资源,所以Servlet程序若想被外界访问,必须把Servlet 程序映射到一个URL 地址上,这个工作在项目we ...

  6. 1228.Poor Pigs 可怜的猪

    转自[LeetCode] Poor Pigs 可怜的猪 There are 1000 buckets, one and only one of them contains poison, the re ...

  7. js对input框的可编辑属性设置

    添加disabled属性 $('#areaSelect').attr("disabled",true); $('#areaSelect').attr("disabled& ...

  8. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  9. valgrind 检查内存泄露

    https://www.oschina.net/translate/valgrind-memcheck

  10. C# 将当前应用程序写入到注册表开机启动项中

    在使用C#进行应用程序的开发过程中,经常有一个需求就是让应用程序开机后自动启动,这个是一个很常见的需求,最常规的做法(这里以Win7操作系统为例),打开:开始=>所有程序=>启动文件夹(路 ...