[CQOI2018]九连环
一、题目
点此看题
二、解法
根据题目中444连环的解释,你可以发现拆除444连环满足如下规律:
- 拆掉一个222连环,使得原环变成110011001100
- 拿掉最左边的111
- 加二连环使其变为011101110111
- 拆三连环
这就完成了一个问题的转化,由于拆和加环效果相同,我们定义dpidp_idpi为拆掉iii连环需要的步数,则有递推式:
dp[i]=2⋅dp[i−2]+dp[i−1]+1dp[i]=2\cdot dp[i-2]+dp[i-1]+1dp[i]=2⋅dp[i−2]+dp[i−1]+1可以把答案写成二进制的形式:1 10 101 1010 10101 ..................
可以发现相邻两个二进制数的和是1111..1111..1111..的形式,所以 dp[i]+dp[i+1]=2i+1dp[i]+dp[i+1]=2^{i+1}dp[i]+dp[i+1]=2i+1,结合dp[n]=2dp[n−1]+(n&1)?1:0dp[n]=2dp[n−1]+(n\&1)?1:0dp[n]=2dp[n−1]+(n&1)?1:0(打表规律),可以发现答案是2i+13\frac{2^{i+1}}{3}32i+1
这样问题就转化成了高精度,可以用FFT\text{FFT}FFT优化,下面写出一些注意事项:
- 清零最重要,每个地方每个数组及时清零
- 不要把数组开在函数里面,开在函数外面反复利用
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 100005;
const double pi = acos(-1.0);
int read()
{int num=0,flag=1;char c;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar();return num*flag;
}
int n,T;
struct complex
{double x,y;complex() {x=y=0;}complex(double X,double Y) : x(X) , y(Y) {}complex operator + (const complex &R) const {return complex(x+R.x,y+R.y);}complex operator - (const complex &R) const {return complex(x-R.x,y-R.y);}complex operator * (const complex &R) const {return complex(x*R.x-y*R.y,x*R.y+y*R.x);}
}A[MAXN],B[MAXN];
void FFT(int len,complex *a,int flg)
{if(len==1) return ;complex a1[len>>1],a2[len>>1];for(int i=0;i<len;i+=2) a1[i>>1]=a[i],a2[i>>1]=a[i+1];FFT(len>>1,a1,flg);FFT(len>>1,a2,flg);const complex w=complex(cos(pi*2.0/len),sin(pi*2.0/len)*flg);complex k=complex(1,0);len>>=1;for(int i=0;i<len;i++,k=k*w){a[i]=a1[i]+k*a2[i];a[i+len]=a1[i]-k*a2[i];}
}
struct bignum
{int n,a[MAXN];bignum() {memset(a,0,sizeof a);n=1;}bignum(int x){memset(a,0,sizeof a);n=0;if(!x) {n=1;return ;}while(x) a[n++]=x%10,x/=10;}void print(){for(int i=n-1;i>=0;i--)printf("%d",a[i]);puts("");}void operator /= (int x){int t=0,len=0;for(int i=n-1;i>=0;i--){t=t*10+a[i];a[i]=t/x;t%=x;if(!len && a[i]) len=i+1;}n=max(len,1);}void operator *= (bignum b){int len=1;while(len<=n+b.n) len<<=1;for(int i=0;i<len;i++) A[i]=B[i]=complex(0,0);for(int i=0;i<n;i++) A[i]=complex(a[i],0);for(int i=0;i<b.n;i++) B[i]=complex(b.a[i],0);FFT(len,A,1);FFT(len,B,1);for(int i=0;i<len;i++) A[i]=A[i]*B[i];FFT(len,A,-1);for(int i=0;i<n+b.n;i++)a[i]=0;for(int i=0;i<n+b.n;i++){a[i]+=(int)(A[i].x/len+0.5);if(a[i]>=10)a[i+1]+=a[i]/10,a[i]%=10;}for(int i=n+b.n-1;i>=0;i--)if(a[i]){n=i+1;break;}}
}a,r;
int main()
{T=read();while(T--){n=read()+1;a=bignum(2),r=bignum(1);while(n>0){if(n&1) r*=a;a*=a;n>>=1;}r/=3;r.print();}
}
[CQOI2018]九连环相关推荐
- BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】
题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...
- 2018十二月刷题列表
Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...
- yyb省选前的一些计划
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...
- c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...
递归算法用函数来实现,通俗地说就是函数对自身的调用,求解递归问题就转化为函数的调用关系问题.函数f(n)随自变量n的增加而变化,函数的调用关系也就表现为f(n)与f(n-1)或f(n-2)关系的问题. ...
- [CQOI2018]异或序列
[CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...
- [CQOI]九连环(FFT优化+高精)
文章目录 题目 题解 code 题目 九连环是一种源于中国的传统智力游戏. 如图所示,九个的圆环套在一把"剑"上,并且互相牵连.游戏的目标是把九个圆环全部从"剑" ...
- 九连环_儿子的玩具—九连环
儿子是7月22号结束了中考,23号参加自主招生考试,24号收到录取电话,25号领取通知书,26号正式上课成为一名高中生,结束初中生活还没来得及歇歇高中就这样开始了. 高中生活非常紧张,早上六点起床赶去 ...
- 求解下列递推关系式_装错信封问题及九连环问题的递推关系式以及通项公式的推导(尤其是高中生一定要读)...
错装信封问题的递推关系式本人在高中时已经自悟出来,但是通项公式没有自悟出来,通项公式是一六年时和李化雨兄弟探讨数学时从他那里学来的,不过后来又经过仔细思考,发现通项公式的推导过程中不除以阶乘也一样可以 ...
- 九连环的解法(收集)
今天星期天看电视呢,看的是一个叫<刁蛮公主>的电视剧,有点意思,里边有一段是和九连环有关的,让我有了一点兴趣,九连环以前在一个朋友家里看到过一个,当时看了一下,认为有点难度,也没有兴趣去研 ...
最新文章
- PAT甲级1107 Social Clusters (30 分):[C++题解]并查集,爱好、人数
- JsonMappingException: (was java.lang.NullPointerException)
- hadoop中实现定制Writable类
- hadoop单机配置(非分布式)
- K均值聚类关于初始聚类中心选取的一种改进(python程序)
- ezsql mysql_数据库连接类ezsql用法
- 服务器全息显示修改,全息显示
- osm数据导入mysql_利用OpenStreetMap(OSM)数据搭建一个地图服务
- 数据库练习题(比较基础)
- 微信赌场——H5棋牌游戏渗透之旅
- 微信Mars-xlog日志加密踩坑指南
- 面对同行抄袭或者抹黑,应该怎么办?
- vue父子组件生命周期执行顺序
- conda创建环境报错conda.core.subdir_data.Response304ContentUnchanged
- 有关华为的七大猜想:或在国内屈居老二
- 浏览器加载解析渲染机制的全面解析
- 小米盒子 装android,当贝市场教你怎么用小米盒子安装非安卓大型游戏
- 如何手工制作html网站地图,提升网站收录率简单的方法是手工制作网站地图与工具生成网站地图两种...
- yarn安装的好用插件
- matlab线性拟合前的准备工作
热门文章
- python编程课程-深圳Python编程课程
- Docker 制作 MySQL 镜像并使用 `/docker-entrypoint-initdb.d/` 机制初始化数据
- uniapp 文件上传 2021-06-10
- 机器学习算法之决策树实现波士顿房屋租赁价格预测
- HLK-W801开发-LVGL图像库移植,并驱动GC9A01圆形屏幕
- python中input()函数的返回是什么类型_Python中input函数的用法是什么?
- 有效沟通的8条核心原则
- ZVS和ZCS软开关技术
- 前端浏览器渲染原理及优化
- 浏览器渲染原理的学习与总结