P4461 [CQOI2018]九连环
思路:\(DP\)
提交:\(2\)次
错因:高精写挂(窝太菜了)
题解:
观察可知\(f[i]=2*f[i-1]+(n\&1)\)
高精的过程参考了WinXP@luogu的思路:
发现一个问题。每一项约等于前一项的 \(2\) 倍。仔细分析,发现
\(dp(n)=2dp(n-1)+ (n\& 1)?1:0\)
既然是 \(2\) 倍,为什么不打一下 \(2\) 进制表示呢?
\(1\ 10 \ 101 \ 1010 \ 10101 \ 101010 \ 1010101......\)
有点意思。
其实也很容易能从\(dp\) 中发现这个规律,每当 \(n\) 为奇数时 \(++\) ,就会使每隔 \(1\)位 \(+1\)。
这也不太好办。 \(n=1e5\) 时,这个 \(2\) 进制数就有 \(1e5\) 位。 \(10\) 进制的高精位数只知道比 \(1e5\) 小却没有办法确定。隔一位一个 \(1\) 也不方便化成 \(10\) 进制啊。不过好像没有什么好办法能直接从 \(2\) 进制的高精转化为 \(10\) 进制的高精。(仅为思考过程)
能不能直接从 \(10\) 进制的高精推过来呢?
如果是二进制表示是 \(1000000....\) ,它就可以轻松地表示为 \(2^n\) 然后用快速幂做了。
那么现在考虑对这个 \(2\) 进制数 \(×3\) 。哦不对,是 \(11\) 。我们来看变成了什么。。
\(11 \ 110 \ 1111 \ 11110 \ 111111 \ 1111110 ......\)
这就可以说是非常显然了吧。( +1 或 +2 变成 10000... )
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll unsigned long long
#define RR register ll
#define R register int
using namespace std;
const int B=1e+8,N=6010;
namespace Luitaryi {
int T,n,sz1,sz2;
ll ret[N],a[N];
inline void mul(ll a[N],int& sz1,ll b[N],int sz2) {
RR tmp[N]; memset(tmp,0,sizeof(tmp)); for(R i=0;i<=sz1;++i)
for(R j=0;j<=sz2;++j) tmp[i+j]+=a[i]*b[j];
sz1+=sz2; for(R i=0;i<=sz1;++i) tmp[i+1]+=tmp[i]/B,tmp[i]%=B;
while(tmp[sz1+1]) ++sz1,tmp[sz1+1]+=tmp[sz1]/B,tmp[sz1]%=B;
memcpy(a,tmp,sizeof(tmp));
}
inline void main() {
scanf("%d",&T); while(T--) {
scanf("%d",&n); R p=n+1; memset(a,0,sizeof(a)),memset(ret,0,sizeof(ret));
ret[0]=1,a[0]=2; sz1=sz2=0; while(p) {
if(p&1) mul(ret,sz2,a,sz1); p>>=1;
if(p) mul(a,sz1,a,sz1);
} if(n&1) ++ret[0]; ret[0]-=2; if(ret[0]<0) ret[0]+=B,--ret[1];
RR k=0; for(R i=sz2;i>=0;--i) k=k*B+ret[i],ret[i]=k/3,k%=3;
while(!ret[sz2]) --sz2; printf("%llu",ret[sz2]);
for(R i=sz2-1;i>=0;--i) printf("%08llu",ret[i]); putchar('\n');
}
}
} signed main() {Luitaryi::main(); return 0;}
2019.08.23
77
P4461 [CQOI2018]九连环的更多相关文章
- 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)
[BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...
- CQOI2018 九连环 打表找规律 fft快速傅里叶变换
题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...
- # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT
今天做了传说中的CQOI六道板子题--有了一种自己很巨的错觉(雾 题面 求n连环的最少步数,n <= 1e5. 题解 首先--我不会玩九连环-- 通过找规律(其实是百度搜索)可知,\(n\)连环 ...
- BZOJ5300:[CQOI2018]九连环——题解
一种打表的方法,适用于知道如何解九连环的人. 我们知道,解九(n)连环必须先解第九(n)环,然后解八(n-1).七(n-2)-- 根据这个我们飞快的写出了一个递推式,设\(f[i]\)为\(i\)连环 ...
- [CQOI2018]九连环
嘟嘟嘟 对于这种找规律的题,我向来是不会的. 通过大佬们的各种打表找规律.神奇dp等方法,我们得到了答案就是\(\lfloor \frac{2 ^ {n + 1}}{3} \rfloor\). 高精是 ...
- 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]九连环 【dp + 高精】
题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...
- yyb省选前的一些计划
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...
随机推荐
- nohup启动后台进程并重定向
一:linux重定向 0,1,2分别表示标准输入,标准输出和标准错误输出,一般情况下默认是标准输出 a. 1>log:标准输出重定向的log文件 b. 2>log:错误输出重定向到log文 ...
- 数位dp踩坑
前言 数位DP是什么?以前总觉得这个概念很高大上,最近闲的没事,学了一下发现确实挺神奇的. 从一道简单题说起 hdu 2089 "不要62" 一个数字,如果包含'4'或者'62', ...
- ARTS 第十周打卡
Algorithm : 做一个 leetcode 的算法题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- recover函数捕获异常
package main import ( //"fmt" "time" ) func test () { var m map[string]int m[&qu ...
- socat安装使用方法
socat,一个多功能的网络工具,名字来源于SOcket CAT,是netcat的增强版,也就是netcat++(扩展了设计,并有新的实现). 推荐:socat官方文档以及 socat - Handl ...
- axios的二次封装
'use strict' import axios from 'axios' import qs from 'qs' var host = "https://www.easy-mock.co ...
- (十一)web服务与javaweb结合(2)
一.解决问题及解决方法 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致. 解决方案:将webService绑定到web工程中,使得共用一个端口. 二.案例 2.1 ...
- AngularJS视图 ng-view
AngularJS支持通过在单个页面上的多个视图的单页应用.要做到这一点AngularJS提供ng-view 和 ng-template指令,以及 $routeProvider 服务. ng-view ...
- tasklist、taskkill命令使用
tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...
- POJ2945(Find the Clones)--字典树,map
题意:给你n个规定长度的单词,问你其中出现了1次的单词,出现两次的单词...出现n次单词分别有多少个. 当然这题map也能过,但是这里介绍字典树的做法. 首相对于n个单词存入树中,当然建树过程中遇到一 ...