[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,一经查实,立即删除!

相关文章

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

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

[指数型生成函数专练]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 在系统边界上提供给外部访问内部接口服务…

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

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

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

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

Sum of Paths CodeForces - 1467D

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

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1&#xff1a;Arc of Dream题目题解codeT2&#xff1a;Recursive sequence题目题解codeT3&#xff1a;233 Matrix题目题解codeT4&#xff1a;Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

文章目录T1&#xff1a;单峰排列题目题解codeT2&#xff1a;历史研究题目题解codeT3&#xff1a;大魔法师题目题解code我可能这辈子都更不出来狂欢赛5了&#xff0c;先咕咕 T1&#xff1a;单峰排列 题目 一个n的全排列A[i]是单峰的&#xff0c;当且仅当存在某个x使得A[1]<…

YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录题目描述数据范围解析代码图片转载自&#xff1a; https://blog.csdn.net/weixin_43346722/article/details/118435430题目描述 平面上有 n个点&#xff0c;用n个大小相同的圆分别将一个点作为圆心&#xff0c;同时满足圆圈不相交&#xff0c;求圆的最大半径。 数据范…

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

一、前言在项目开发中&#xff0c;日志系统是系统的一个重要组成模块&#xff0c;通过在程序中记录运行日志、错误日志&#xff0c;可以让我们对于系统的运行情况做到很好的掌控。同时&#xff0c;收集日志不仅仅可以用于诊断排查错误&#xff0c;由于日志同样也是大量的数据&a…

[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

文章目录引入概念全套模板变量声明updaterotate旋转splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题&#xff1a;P3369 【模板】普通平衡树题目code声明一下&#xff0c;许多代码的注解都在模板代码里面写了的&#xff0c;所以正文…