【LOJ】#2535. 「CQOI2018」九连环
题解
简单分析一下,有\(k\)个环肯定是,我拆掉了\(k - 2\)个,留最左两个,1步拆掉最左的,这个时候我还要把这\(k - 2\)个环拼回去,拆一次\(k - 1\)
所以方案数就是\(f[k] = f[k - 1] + 2 * f[k - 2] + 1\)
然而太简单了,简单的都不是省选题了,所以他没让你取模= =,让你写FFT的高精乘,强行增加代码量
这个矩阵有几个位置默认是0,可以通过不对那里进行运算减小常数
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int, int>
#define pdi pair<db, int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 1000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template <class T>
void read(T &res) {
res = 0;
char c = getchar();
T f = 1;
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template <class T>
void out(T x) {
if (x < 0) {
x = -x;
putchar('-');
}
if (x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int BASE = 10;
const int len = 8;
const int MOD = 998244353, MAXL = (1 << 20);
int W[MAXL + 5];
int inc(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }
int mul(int a, int b) { return 1LL * a * b % MOD; }
int fpow(int x, int c) {
int res = 1, t = x;
while (c) {
if (c & 1) res = 1LL * res * t % MOD;
t = 1LL * t * t % MOD;
c >>= 1;
}
return res;
}
struct Bignum {
vector<int> v;
Bignum() { *this = 0; }
Bignum operator=(int64 x) {
v.clear();
do {
v.pb(x % BASE);
x /= BASE;
} while (x);
return *this;
}
friend Bignum operator+(const Bignum &a, const Bignum &b) {
Bignum c;
c.v.clear();
int p = 0, g = 0;
while (1) {
int x = g;
if (p < a.v.size()) x += a.v[p];
if (p < b.v.size()) x += b.v[p];
if (!x && p >= a.v.size() && p >= b.v.size()) break;
c.v.pb(x % BASE);
g = x / BASE;
++p;
}
return c;
}
friend void NTT(Bignum &a, int L, int on) {
a.v.resize(L, 0);
for (int i = 1, j = L >> 1; i < L - 1; ++i) {
if (i < j) swap(a.v[i], a.v[j]);
int k = L >> 1;
while (j >= k) {
j -= k;
k >>= 1;
}
j += k;
}
for (int h = 2; h <= L; h <<= 1) {
int wn = W[(MAXL + MAXL * on / h) % MAXL];
for (int k = 0; k < L; k += h) {
int w = 1;
for (int j = k; j < k + h / 2; ++j) {
int u = a.v[j], t = mul(w, a.v[j + h / 2]);
a.v[j] = inc(u, t);
a.v[j + h / 2] = inc(u, MOD - t);
w = mul(w, wn);
}
}
}
if (on == -1) {
int InvL = fpow(L, MOD - 2);
for (int i = 0; i < L; ++i) a.v[i] = mul(a.v[i], InvL);
}
}
friend Bignum operator*(Bignum a, Bignum b) {
Bignum c;
int t = (a.v.size() + b.v.size()), L;
L = 1;
while (L <= t) L <<= 1;
NTT(a, L, 1);
NTT(b, L, 1);
c.v.resize(L);
for (int i = 0; i < L; ++i) c.v[i] = mul(a.v[i], b.v[i]);
NTT(c, L, -1);
int64 g = 0;
for (int i = 0; i < L; ++i) {
int64 x = g + c.v[i];
c.v[i] = x % BASE;
g = x / BASE;
}
while (g) {
c.v.pb(g % BASE);
g /= BASE;
}
L = c.v.size() - 1;
while (L && c.v[L] == 0) {
c.v.pop_back();
--L;
}
return c;
}
void print() {
for (int i = v.size() - 1; i >= 0; --i) {
putchar('0' + v[i]);
}
}
} num;
struct Matrix {
Bignum f[3][3];
friend Matrix operator*(const Matrix &a, const Matrix &b) {
Matrix c;
c.f[2][2] = 1;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
for (int k = 0; k < 2; ++k) {
c.f[i][j] = c.f[i][j] + a.f[i][k] * b.f[k][j];
}
}
}
for (int j = 0; j < 2; ++j) {
for (int k = 0; k < 3; ++k) {
c.f[2][j] = c.f[2][j] + a.f[2][k] * b.f[k][j];
}
}
return c;
}
} A, ans;
void Init() {
W[0] = 1;
W[1] = fpow(3, (MOD - 1) / MAXL);
for (int i = 2; i < MAXL; ++i) {
W[i] = mul(W[i - 1], W[1]);
}
A.f[0][0] = 1;
A.f[0][1] = 1;
A.f[1][0] = 2;
A.f[2][0] = 1;
A.f[2][2] = 1;
}
void fpow(Matrix &res, int c) {
Matrix t = A;
res = A;
--c;
while (c) {
if (c & 1) res = res * t;
t = t * t;
c >>= 1;
}
}
void Solve() {
int N;
read(N);
if (N == 1) {
puts("1");
} else if (N == 2) {
puts("2");
} else {
fpow(ans, N - 2);
num = ans.f[0][0] + ans.f[0][0] + ans.f[1][0] + ans.f[2][0];
num.print();
enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in", "r", stdin);
#endif
Init();
int T;
read(T);
while (T--) Solve();
return 0;
}
【LOJ】#2535. 「CQOI2018」九连环的更多相关文章
- loj#2531. 「CQOI2018」破解 D-H 协议(BSGS)
题意 题目链接 Sol 搞个BSGS板子出题人也是很棒棒哦 #include<bits/stdc++.h> #define Pair pair<int, int> #defin ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- tomcat 启用NIO
从Tomcat6.0以后, Java开发者很容易就可以是用NIO的技术来提升tomcat的并发处理能力. <Connector port="8080" protocol=&q ...
- Racket Cheat Sheet
Racket Cheat Sheet 来源 http://docs.racket-lang.org/racket-cheat/index.html?q=Racket%20Cheat%20Sheet ...
- HGOI 20181101题解
/* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...
- 【转】STM32 - 程序跳转、中断、开关总中断
程序跳转注意: 1.如果跳转之前的程序A里有些中断没有关,在跳转之后程序B的中断触发,但程序B里没有定义中断响应函数,找不到地址会导致死机. 2.程序跳转前关总中断,程序跳转后开总中断(关总中断,只是 ...
- EasyUI 格式化列
以下实例格式化在 easyui DataGrid 里的列数据,并使用自定义列的 formatter,如果价格小于 20 就将文本变为红色. 为了格式化一个数据网格(DataGrid)列,我们需要设置 ...
- windows服务写完之后怎么让它跑起来
当然你可以在命令框里面自己去手动的敲代码,也可以写一个.bat文件一劳永逸......这里我就介绍写.bat文件的方法 就是上图所示的三个东东啦,有了这三个东东,把他们拖到你windows服务的deb ...
- Java模拟http请求远程调用接口工具类
package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...
- Solr记录-solr基础内容
Solr架构(体系结构) 在本章中,我们将讨论Apache Solr的架构. 下图显示了Apache Solr的体系结构的框图. Solr架构 - 构件块以下是Apache Solr的主要构建块(组件 ...
- 转自知乎大神---什么是 JS 原型链?
我们知道 JS 有对象,比如 var obj = { name: 'obj' } 我们可以对 obj 进行一些操作,包括 「读」属性 「新增」属性 「更新」属性 「删除」属性 下面我们主要来看一下「读 ...
- Sublime Text 3 绿色汉化版 x64
之前做了<Sublime Text 2 绿色汉化版 x64>,这些天抽空做了下 ST3 的汉化.. 果然我没有任何理由爱上 ST3,不仅pojie麻烦,而且汉化更麻烦,菜单字符长度做了限制 ...