[CQOI]九连环(FFT优化+高精)

文章目录

  • 题目
  • 题解
  • code

题目

九连环是一种源于中国的传统智力游戏。
在这里插入图片描述
如图所示,九个的圆环套在一把“剑”上,并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。
圆环的装卸需要遵守两个规则
1.第一个(最右边)环任何时候都可以任意装上或卸下
2.如果第k个环没有被卸下,且第k个环右边的所有环都被卸下,则第k+l个环(第k个环左边相邻的环)
可以任意装上或卸下与魔方的千变万化不同,解九连环的最优策略是唯一的。
为简单起见,我们以“四连环”为例,演示这一过程。这里用1表示环在“剑”上,0表示环已经卸下。
初始状态为1111,每步的操作如下

  1. 1101(根据规则2卸下第2个环)
  2. 1100(根据规则1卸下第1个环)
  3. 0100(根据规则2卸下第4个环)
  4. 0101(根据规则1装上第1个环)
  5. 0111(根据规则2装上第2个环)
  6. 0110(根据规则1卸下第1个环)
  7. 0010(根据规则2卸下第3个环)
  8. 0001(根据规则1装上第1个环)
  9. 0001(根据规则2卸下第2个环)
  10. 0000(根据规则1卸下第1个环)

由此可见,卸下“四连环”至少需要10步。
随着环数增加,需要的步数也会随之增多。例如卸下九连环.就至少需要341步。
请你计算,有n个环的情况下,按照规则,全部卸下至少需要多少步

Input
输入文件第一行,为一个整数m,表示测试点数目。
接下来m行,每行一个整数n。
1≤n≤10^5,1≤m≤10
Output
输出文件共m行,对应每个测试点的计算结果

Sample Input
3
3
5
9
Sample Output
5
21
341

题解

直接给递推式f(n)=f(n−1)+2∗f(n−2)+1f(n)=f(n-1)+2*f(n-2)+1f(n)=f(n1)+2f(n2)+1,结论就是2n+13\frac{2^{n+1}}{3}32n+1
在这里插入图片描述


从三个不同的方向走向一起:
1.1.1.买一本高中数学必修5,里面有九连环的结论详细证明
在这里插入图片描述


2.2.2.打表发现规律

n1234567
12510214285

转换成二进制,规律越发明显

n1234567
12510214285
1101011010101011010101010101

好看吧!发现1,01,01,0是不相邻的,就可以考虑二进制乘法,竹格利兹
1010101×111010101101010111111111=(27+1−1)\begin{aligned} 1010101\\×11\\1010101\\1010101~~\\11111111\\=(2^{7+1}-1)\end{aligned}1010101×1110101011010101  11111111=(27+11)

101010×111010101010101111110=(26+1−2)\begin{aligned} 101010\\×11\\101010\\101010~~\\1111110\\=(2^{6+1}-2)\end{aligned}101010×11101010101010  1111110=(26+12)
总结一下就是
2n+13\frac{2^{n+1}}{3}32n+1
在这里插入图片描述


3.3.3.感性理解,观看四连环的例子,我们发现首先是把四连环111111111111变成两连环110011001100,然后就可以把nnn环拿走,然后用同样的步数变回四连环011101110111,然后就是同理去拿走n−1n-1n1环,所以我们设f(n)f(n)f(n)表示nnn连环的方案数,那么可以表示成拿走n−2n-2n2环的方案数然后把拿走最后一个环,把最右边的第一个环装回来+1+1+1,再用同样的步数变成n−2n-2n2环的方案数,继续处理n−1n-1n1环的方案数
f(n)=f(n−1)+2∗f(n−2)+1f(n)=f(n-1)+2*f(n-2)+1f(n)=f(n1)+2f(n2)+1


1≤n≤1051\le n\le 10^51n105,所以就要高精啦,然后再套一个FFTFFTFFT优化,看代码吧,如果有任何不懂的,欢迎评论
在这里插入图片描述

code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 80005
struct complex {double real, i;complex () {}complex ( double x, double y ) {real = x;i = y;}
};
complex operator + ( complex a, complex b ) {return complex ( a.real + b.real, a.i + b.i );
}
complex operator - ( complex a, complex b ) {return complex ( a.real - b.real, a.i - b.i );
}
complex operator * ( complex a, complex b ) {return complex ( a.real * b.real - a.i * b.i, a.real * b.i + b.real * a.i );
}
double pi = acos ( -1.0 );int rev[MAXN];void FFT ( complex *c, int f, int len ) {for ( int i = 0;i < len;i ++ )if ( i < rev[i] )swap ( c[i], c[rev[i]] );for ( int i = 1;i < len;i <<= 1 ) {complex omega ( cos ( pi / i ), f * sin ( pi / i ) );for ( int j = 0;j < len;j += ( i << 1 ) ) {complex w ( 1, 0 );for ( int k = 0;k < i;k ++, w = w * omega ) {complex x = c[j + k], y = w * c[i + j + k];c[j + k] = x + y;c[i + j + k] = x - y;}}}
}struct big {int g[MAXN], len;big () {memset ( g, 0, sizeof ( g ) );len = 0;}big ( int x ) {memset ( g, 0, sizeof ( g ) );len = 0;if ( ! x ) {len = 1;return;}while ( x ) {g[len ++] = x % 10;x /= 10;}}big operator *= ( const big &b ) {static complex A[MAXN], B[MAXN];int new_len = len + b.len, limit = 1, l = 0;while ( limit < new_len ) {limit <<= 1;l ++;}for ( int i = 0;i < limit;i ++ )rev[i] = ( rev[i >> 1] >> 1 ) | ( ( i & 1 ) << ( l - 1 ) );for ( int i = 0;i < limit;i ++ ) {A[i] = complex ( i < len ? g[i] : 0, 0 );B[i] = complex ( i < b.len ? b.g[i] : 0, 0 );}FFT ( A, 1, limit );FFT ( B, 1, limit );for ( int i = 0;i < limit;i ++ )A[i] = A[i] * B[i];FFT ( A, -1, limit );static int ans[MAXN];for ( int i = 0;i < limit;i ++ )ans[i] = ( int ) ( A[i].real / limit + 0.5 );for ( int i = 0;i < limit;i ++ )if ( ans[i] > 9 ) {ans[i + 1] += ans[i] / 10;ans[i] %= 10;}-- limit;while ( limit > 0 && ans[limit] == 0 )limit --;len = ++ limit;for ( int i = 0;i < limit;i ++ )g[i] = ans[i];}big operator /= ( int x ) {int sum = 0, new_len = 0;for ( int i = len - 1;i >= 0;i -- ) {sum = ( sum << 1 ) + ( sum << 3 ) + g[i];if ( sum < x )g[i] = 0;else {if ( ! new_len ) new_len = i + 1;g[i] = sum / x;sum %= x;}}len = max ( new_len, 1 );}void print () {for ( int i = len - 1;i >= 0;i -- )printf ( "%d", g[i] );printf ( "\n" );} 
}result, tmp;int main() {int m, n;scanf ( "%d", &m );while ( m -- ) {scanf ( "%d", &n );n ++;result = ( 1 ), tmp = ( 2 );while ( n ) {if ( n & 1 )result *= tmp;tmp *= tmp;n >>= 1;}result /= 3;result.print();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客挑战赛53G-同源数组(Easy Version)【NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出nnn个长度为mmm的数组&#xff0c;然后你每次可以进行差分&#xff08;不会改变数组长度那种&#xff09;和前缀和。 如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组&…

莫比乌斯反演 做题记录

来自Peterwuyihong 的题单。 前置知识 前置芝士1 数论分块 UVA11526 H(n) P2261 [CQOI2007]余数求和 P2260 [清华集训2012]模积和 其中有一个式子需要注意一下&#xff1a;\[\sum_{i1}^n\sum_{j1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloo…

Three Bags CodeForces - 1467C

题意&#xff1a; 三堆石子&#xff0c;你可以取两堆石子各一个石头a,b。然后消掉a&#xff0c;使得bb-a再放入b的那一堆。这样操作直到只剩下一个石子&#xff0c;求该石子价值最大。 题解&#xff1a; 构造题 可以构造出两者情况&#xff1a; 其中两堆都是正的&#xff0…

任正非公开信:投入 20 亿美元全面提升华为软件质量

昨天&#xff0c;华为心声社区发布了来自任正非的公开信《全面提升软件工程能力与实践&#xff0c;打造可信的高质量产品》&#xff0c;信中强调从基础代码做起&#xff0c;全面提升华为软件工程能力和实践&#xff0c;其中提到一些重要举措&#xff0c;包括编码质量、架构设计…

YBTOJ洛谷P2223:软件开发(费用流)

文章目录题目描述解析代码题目描述 某软件公司正在规划一项nnn天的软件开发计划&#xff0c;根据开发计划第iii天需要nin_ini​个软件开发人员&#xff0c;为了提高软件开发人员的效率&#xff0c;公司给软件人员提供了很多的服务&#xff0c;其中一项服务就是要为每个开发人员…

高维前缀和

高维前缀和 主要内容 昨天(\(\texttt{2022.2.28}\))打 ARC 的 D 题时&#xff0c;恍然发现我不会高维前缀和&#xff0c;匆匆来学一下。 比如二维前缀和 \(s_{i,j}\) 表示在一个二维平面上从 \((1,1)\) 到 \((i,j)\) 的所有点的权值之和&#xff0c;我们定义高维前缀和 \(s_{p_…

P3577-[POI2014]TUR-Tourism【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3577 题目大意 给出nnn个点mmm条边的一张图&#xff0c;每个点有费用CiC_iCi​&#xff0c;求选出费用和最小的点使得每个点都至少有一个相邻的点&#xff08;或自己&#xff09;被选择。保证图上不存在超过101010个点的简单…

[指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数

文章目录T1&#xff1a;chocolate题目题解codeT2&#xff1a;“红色病毒”问题题目题解codeT3&#xff1a;排列组合题目题解codeT4&#xff1a;字串数题解codeT1&#xff1a;chocolate 题目 已帮大家翻译了&#xff0c;不要去UVA或者luogu上面交&#xff0c;卡精度&#xff0…

微服务之:从零搭建ocelot网关和consul集群

介绍微服务中有关键的几项技术&#xff0c;其中网关和服务服务发现&#xff0c;服务注册相辅相成。首先解释几个本次教程中需要的术语网关 Gateway&#xff08;API GW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是企业 IT 在系统边界上提供给外部访问内部接口服务…

一起开心寒假训练总复习

文章目录畅通工程题意&#xff1a;题解&#xff1a;代码&#xff1a;小希的迷宫题解&#xff1a;代码&#xff1a;Express Mail Taking题意&#xff1a;题解&#xff1a;代码&#xff1a;Reports题意&#xff1a;题解&#xff1a;代码&#xff1a;放苹果题意&#xff1a;题解&a…

YBTOJ:放置棋子(费用流)

文章目录题目描述解析代码题目描述 有一个n*n的棋盘&#xff0c;可以在上面放棋子。 有些格子不能放棋子&#xff0c;有些格子必须放棋子&#xff0c;剩下的格子随意。 要求放好棋子之后满足如下两条要求&#xff1a; 第 i 行和第 i 列的棋子数目必须一样多。 第 i 行的棋子数…

Prufer 序列

Prufer 序列 定义与建立 Prufer 序列可以将一个带标号 \(n\) 个结点的树用 \([1,n]\) 中的 \(n-2\) 个整数表示。一个无向带标号生成树与数列之间的双射。 对于一棵树&#xff0c;每次我们选择它编号最小的叶子结点&#xff0c;删除它并记录下与它相连的节点的编号&#xff0c;…

CF476D-Dreamoon and Sets【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF476D 题目大意 求nnn个四元组使得 所有四元组内没有重复的数。四元组内的数字两两之间gcdgcdgcd都为kkk。 要求使得最大的数字最小 1≤n≤10000,1≤k≤1001\leq n\leq 10000,1\leq k\leq 1001≤n≤10000,1≤k≤100 解题思…

使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍WRK 是一款轻量且易用的 HTTP 压力测试工具&#xff0c;通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试&#xff0c;并且针对测试的情况返回结果。PS&#xff1a;Wrk 并不能针对测试的结果生成动态的图表&#xff0c;如果有这种需要&#xff0c;可…

Codeforces Round #696

Codeforces Round #696 文章目录CF1474A Puzzle From the Future题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474B Different Divisors题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474C Array Destruction题意&#xff1a;题解&#xff1a;代码&#xff1a;C…

YBTOJ洛谷P4068:数字配对(网络流)

文章目录题目描述解析代码题目描述 有n种数字&#xff0c;第 i 种数字是 ai&#xff0c;有 bi个&#xff0c;权值是 ci。 若两个数字 ai,aj 满足&#xff0c; ai 是 aj 的倍数&#xff0c;且 ai/aj 是一个质数&#xff0c;那么这两个数字可以配对&#xff0c;并获得 ci*cj 的…

Comet OJ(Contest #14)-飞翔的小鸟【tarjan】

正题 题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id4124 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;边有边权&#xff0c;qqq次询问从点111走到点xxx的所有路径&#xff08;可以重复经过任何点包括点xxx&#xff09;中极差最大是多少。 1≤…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

数数题(计数类 DP)做题记录

数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当&#xff1a;所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和。 完全图点数为 \(n\)&#xff0c;边权 \(\in[1,k]\)&#xff0c;\(1\le n,k\le 250\)。 发现所有和 \(1\)…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意&#xff1a; 定义一条好的路径&#xff0c;当且仅当从任意点出发之后恰好经过了 k 次移动&#xff0c;定义这条路径的权值为经过点权值的总和(可重)&#xff0c;进行 q 次修改&#xff0c;每次将ak 改…