BZOJ5300:[CQOI2018]九连环——题解
一种打表的方法,适用于知道如何解九连环的人。
我们知道,解九(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]九连环——题解的更多相关文章
- # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT
今天做了传说中的CQOI六道板子题--有了一种自己很巨的错觉(雾 题面 求n连环的最少步数,n <= 1e5. 题解 首先--我不会玩九连环-- 通过找规律(其实是百度搜索)可知,\(n\)连环 ...
- BZOJ5300 [Cqoi2018]九连环 【dp + 高精】
题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...
- BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】
题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...
- 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 然后可以构造两个等式: ...
- 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)
[BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...
- CQOI2018简要题解
CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...
- CQOI2018 九连环 打表找规律 fft快速傅里叶变换
题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...
- CQOI2018 简要题解
破解D-H协议 列个式子会发现是BSGSBSGSBSGS的模板题,直接码就是了. 代码: #include<bits/stdc++.h> #include<tr1/unordered ...
- P4461 [CQOI2018]九连环
思路:\(DP\) 提交:\(2\)次 错因:高精写挂(窝太菜了) 题解: 观察可知\(f[i]=2*f[i-1]+(n\&1)\) 高精的过程参考了WinXP@luogu的思路: 发现一个问 ...
随机推荐
- STM32F746G-DISCO官方例程烧写
1. 首先安装STM32 ST-LINK Utility v3.9.0.exe,必须V3.9版本(官方说的) 2. 打开软件,选择External Loader,选择N25Q128A_STM32F74 ...
- MySQL高级-查询截取分析
一.如何分析 1.观察.至少跑1天,看看生产的慢SQL情况. 2.开启慢查询日志,设置阙值比如超过5秒钟的就是慢SQL,并将它抓取出来. 3.explain + 慢SQL分析 4.show profi ...
- android 学习十四 探索安全性和权限
1.部署安全性:应用程序必须使用数字证书才能安装到设备上. 2.执行期间的安全性: 2.1 使用独立进程 2.2 使用固定唯一用户ID 2.3 申明性权限模型 3数字证书 ...
- Adobe Photoshop CC2018最新教程+某宝店铺装修教程
PS免费教程,ps淘宝店铺装修教程.该资源为本人从某商网站重金买来,现免费分享给大家,下载地址:百度网盘,https://pan.baidu.com/s/127PjFbGwVVUVce1litHFsw
- linux系统简单命令
# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...
- Spring Cloud(五):Hystrix 监控面板【Finchley 版】
Spring Cloud(五):Hystrix 监控面板[Finchley 版] 发表于 2018-04-16 | 更新于 2018-05-10 | 在上一篇 Hystrix 的介绍中,我们提到 ...
- AngularJS 初探
AngularJS,诞生于2009年,由Misko Hevery等人创建,后为Google所收购.这是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为 ...
- n! 阶乘
其实1.2.3.4.6.7…都是可以不用考虑的,因此选择以5为迭代步数即可. 首先,这些数字都可以不用进行%5(对5取余数)运算,因此每次循环时可以直接将函数的count变量直接加1.其次,考虑25. ...
- 【MySQL解惑笔记】Navicat 无法远程连接MySQL数据库
安装好Navicat之后远程连接MySQL数据库出现以下报错截图: 出现以上截图怀疑是mysql用户权限不够: GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.1 ...
- 技本功丨知否知否,Redux源码竟如此意味深长(下集)
上集回顾 Redux是如何使用的?首先再来回顾一下这个使用demo(谁让这段代码完整地展示了redux的使用) 如果有小伙伴对这段代码不是很理解的话,建议先去学习Redux的使用再来看这篇源码,这样更 ...