一种打表的方法,适用于知道如何解九连环的人。

我们知道,解九(n)连环必须先解第九(n)环,然后解八(n-1)、七(n-2)……

根据这个我们飞快的写出了一个递推式,设\(f[i]\)为\(i\)连环的最少步,则:

\(f[i]=f[i-1]+f[i-2]*2+1\)

然后推到这里就不会了。(如果有人知道怎么解的话欢迎交流)

但是如果你用这个方法打表的话就会发现:

当\(i\)为奇数的时候有\(f[i]=f[i-1]*2+1\);

当\(i\)为偶数的时候有\(f[i]=f[i-1]*2\)。

利用这个规律从上往下推,同时记录1的出现个数以及2被乘了几次,你会惊奇的发现1的个数恰好等于\(f[i-2]\)。

可以得到:

\(f[i]=2^{i-1}+f[i-2]\)

利用等差数列求和公式以及分奇偶性讨论可以得到:

当\(i\)为奇数:\(f[i]=\frac{2^{i+1}-1}{3}\)

当\(i\)为偶数:\(f[i]=\frac{2^{i+1}-2}{3}\)

当然符合计算机整除的语言应该为:

对所有\(i\):\(f[i]=\frac{2^{i+1}}{3}\)

然后大整数类我写了一个下午,在漫长的报错中我放弃了结构体……

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
typedef long double dl;
typedef long long ll;
const dl pi=acos(-1.0);
const int N=2e6+5;
struct complex{//定义复数
dl x,y;
complex(dl xx=0.0,dl yy=0.0){
x=xx;y=yy;
}
complex operator +(const complex &b)const{
return complex(x+b.x,y+b.y);
}
complex operator -(const complex &b)const{
return complex(x-b.x,y-b.y);
}
complex operator *(const complex &b)const{
return complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
};
void FFT(complex a[],int n,int on){
for(int i=1,j=n>>1;i<n-1;i++){
if(i<j)swap(a[i],a[j]);
int k=n>>1;
while(j>=k){j-=k;k>>=1;}
if(j<k)j+=k;
}
for(int i=2;i<=n;i<<=1){
complex res(cos(-on*2*pi/i),sin(-on*2*pi/i));
for(int j=0;j<n;j+=i){
complex w(1,0);
for(int k=j;k<j+i/2;k++){
complex u=a[k],t=w*a[k+i/2];
a[k]=u+t;
a[k+i/2]=u-t;
w=w*res;
}
}
}
if(on==-1)
for(int i=0;i<n;i++)a[i].x/=n;
}
int k[2][N],tmp[N];
int l[2];
void divd(int p,int b){
int len=0,e=0;
for(int i=l[p]-1;i>=0;i--){
e=e*10+k[p][i];
if(e>=b){
tmp[len++]=e/b;
e%=b;
}else if(len)tmp[len++]=0;
}
if(!len)tmp[len++]=0;
for(int i=0;i<=len-i-1;i++)swap(tmp[i],tmp[len-i-1]);
memcpy(k[p],tmp,sizeof(tmp));l[p]=len;
}
void print(int p){
for(int i=l[p]-1;i>=0;i--)
printf("%d",k[p][i]);
puts("");
}
complex x[N],y[N];
void multi(int p1,int p2){
int len1=l[p1],len2=l[p2];
int n=1;
while(n<len1*2||n<len2*2)n<<=1;
for(int i=0;i<len1;i++)x[i]=complex(k[p1][i],0);
for(int i=len1;i<n;i++)x[i]=complex(0,0);
for(int i=0;i<len2;i++)y[i]=complex(k[p2][i],0);
for(int i=len2;i<n;i++)y[i]=complex(0,0);
FFT(x,n,1);FFT(y,n,1);
for(int i=0;i<n;i++)x[i]=x[i]*y[i];
FFT(x,n,-1);
for(int i=0;i<n;i++)k[p1][i]=(int)(x[i].x+0.5);
for(int i=0;i<n;i++){
k[p1][i+1]+=k[p1][i]/10;k[p1][i]%=10;
}
n=len1+len2-1;
while(k[p1][n]<=0&&n>0)n--;
l[p1]=n+1;
}
int main(){
int n,m;
scanf("%d",&m);
while(m--){
scanf("%d",&n);n++;
k[0][0]=1,k[1][0]=2,l[0]=1,l[1]=1;
while(n){
if(n&1)multi(0,1);
multi(1,1);
n>>=1;
}
divd(0,3);
print(0);
}
return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ5300:[CQOI2018]九连环——题解的更多相关文章

  1. # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT

    今天做了传说中的CQOI六道板子题--有了一种自己很巨的错觉(雾 题面 求n连环的最少步数,n <= 1e5. 题解 首先--我不会玩九连环-- 通过找规律(其实是百度搜索)可知,\(n\)连环 ...

  2. BZOJ5300 [Cqoi2018]九连环 【dp + 高精】

    题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...

  3. BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】

    题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...

  4. 2019.01.02 bzoj5300: [Cqoi2018]九连环(fft优化高精+快速幂)

    传送门 题意不好描述(自己看样例解释) 首先可以推出一个递推式:fn=fn−1+2fn−2+1f_n=f_{n-1}+2f_{n-2}+1fn​=fn−1​+2fn−2​+1 然后可以构造两个等式: ...

  5. 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)

    [BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...

  6. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  7. CQOI2018 九连环 打表找规律 fft快速傅里叶变换

    题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...

  8. CQOI2018 简要题解

    破解D-H协议 列个式子会发现是BSGSBSGSBSGS的模板题,直接码就是了. 代码: #include<bits/stdc++.h> #include<tr1/unordered ...

  9. P4461 [CQOI2018]九连环

    思路:\(DP\) 提交:\(2\)次 错因:高精写挂(窝太菜了) 题解: 观察可知\(f[i]=2*f[i-1]+(n\&1)\) 高精的过程参考了WinXP@luogu的思路: 发现一个问 ...

随机推荐

  1. 机器学习常用算法(LDA,CNN,LR)原理简述

    1.LDA LDA是一种三层贝叶斯模型,三层分别为:文档层.主题层和词层.该模型基于如下假设:1)整个文档集合中存在k个互相独立的主题:2)每一个主题是词上的多项分布:3)每一个文档由k个主题随机混合 ...

  2. dva 路由跳转

    1.从props取出并传递history 取 const { history } = this.props 用 <button onClick={ () => history.push(' ...

  3. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  4. Qt-第一个QML程序-1-项目工程的建立

    这个小程序是我发的第一个完整的QMl程序,这个程序也会持续的更新,一步一步的完善起来,最后会有一个什么样的结果也是不知道,只是把自己目前掌握的QML相关的东西都慢慢的写进来,积累起来 先展示一下运行结 ...

  5. Linearize an sRGB texture in Photoshop

    From:https://forum.unity.com/threads/bug-with-bypass-srgb-sampling.282469/

  6. 【WXS全局对象】Global

    Global对象的方法调用时,无需使用 Global.parseInt(...),而是直接使用 parseInt(...) 方法: 名称 说明 parseInt(string, radix) 解析一个 ...

  7. (python)leetcode刷题笔记05 Longest Palindromic Substring

    5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...

  8. Java异常层次结构

    1. 如果是不可查异常(unchecked exception),即Error.RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在 ...

  9. css多行文本溢出显示省略号(…)

    text-overflow:ellipsis属性可以实现单行文本的溢出显示省略号(…).但部分浏览器还需要加宽度width属性. css代码: overflow: hidden; text-overf ...

  10. halcon基础应用和方法经验分享

    halcon基础应用和方法经验分享 一.Halcon软件 的安装 安装一直点下一步就好了,这个过程很简单,就不讲了 二.Halcon软件license安装 Halcon是商业视觉软件,是需要收费的,但 ...