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

我们知道,解九(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. sqlserver 循环赋值变量

    sql server 是可以用 @变量 +=值的: 第一:必须在循环里面, 第二: 必须在循环外面初始化变量的值 如:  @变量=''; 这样才能循环给值

  2. 怎样从Java转换到Kotlin代码:现在就开始使用Kotlin(KAD 29)

    作者:Antonio Leiva 时间:Jul, 4, 2017 原文链接:https://antonioleiva.com/kotlin-from-java/ Kotlin最神奇特性之一是它能与Ja ...

  3. Appium安装教程

    一.适用操作系统Win7 旗舰版Sp1 64位操作系统 或 32位操作系统二.所需软件jdk-7u45-windows-i586.exenode-v0.10.28-x86.msi (32位)下载地址: ...

  4. C do whlie 数数位

    #include <stdio.h> int main(int argc, char **argv) {    //定义两个变量 x 跟 n,n的初始化为0:  int x;  int n ...

  5. Ducci序列 (Ducci Sequence,ACM/ICPC Seoul 2009,UVa1594)

    题目描述: 题目思路: 直接模拟 #include<stdio.h> #include<string.h> #define maxn 105 int less(const ch ...

  6. 一个五位数ABCDE乘以9,得到EDCBA,求此五位数

    此题是面试时某面试官突然抛出的,要求逻辑分析推导,不许编码,5分钟时间算出来最终结果,当然,最终没有完全推算出来 下面是编码实现 #一个五位数ABCDE*9=EDCBA,求此数 for a in ra ...

  7. LeetCode 138——复制带随机指针的链表

    1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ...

  8. 性能度量之Confusion Matrix

    例子:一个Binary Classifier 假设我们要预测图片中的数字是否为数字5.如下面代码. X_train为训练集,每一个instance为一张28*28像素的图片,共784个features ...

  9. MyBatis中文文档

    http://mybatis.github.io/mybatis-3/zh/index.html

  10. NIO 服务端TCP连接管理的方案

    最近做的一个项目需要在服务端对连接端进行管理,故将方案记录于此. 方案实现的结果与背景 因为服务端与客户端实现的是长连接,所以需要对客户端的连接情况进行监控,防止无效连接占用资源. 完成类似于心跳的接 ...