思路:\(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]九连环的更多相关文章

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

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

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

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

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

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

  4. BZOJ5300:[CQOI2018]九连环——题解

    一种打表的方法,适用于知道如何解九连环的人. 我们知道,解九(n)连环必须先解第九(n)环,然后解八(n-1).七(n-2)-- 根据这个我们飞快的写出了一个递推式,设\(f[i]\)为\(i\)连环 ...

  5. [CQOI2018]九连环

    嘟嘟嘟 对于这种找规律的题,我向来是不会的. 通过大佬们的各种打表找规律.神奇dp等方法,我们得到了答案就是\(\lfloor \frac{2 ^ {n + 1}}{3} \rfloor\). 高精是 ...

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

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

  7. 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 然后可以构造两个等式: ...

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

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

  9. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

随机推荐

  1. SAS学习笔记33 格式修饰符

    冒号(:)格式修饰符 从非空格开始读取变量所对应的数据,直到满足以下任何一种情况 遇到下一个空格列 对应变量所定义的长度已经读满 数据行结束 &格式修饰符 修饰所读取为字符型的列数据中含有一个 ...

  2. SAS学习笔记4 基本运算语句(lag、retain、_n_函数)

    lag:返回的是上一次lag函数运行时的实参,即lag(argument)=上一次lag函数执行时的argument retain:对变量进行值的初始化和保留到下一个迭代步 _n_:data步的自动变 ...

  3. PyCryptodome安装使用方法

    PyCryptodome是PyCrypto的一个分支.基于PyCrypto2.6.1,多了以下特性: Authenticated encryption modes (GCM, CCM, EAX, SI ...

  4. BZOJ3879 SvT(后缀树+虚树)

    对反串建SAM得到后缀树,两后缀的lcp就是其在后缀树上lca的len值,于是每次询问对后缀树建出虚树并统计答案即可. #include<iostream> #include<cst ...

  5. Idea 使用 Junit4 进行单元测试

    目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...

  6. (四)Spring Boot之配置文件-多环境配置

    一.Properties多环境配置 1. application.properties配置激活选项 spring.profiles.active=dev 2.添加其他配置文件 3.结果 applica ...

  7. JS使用MD5加密

    MD5加密JS代码 /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algor ...

  8. c#入门学习笔记

    Hello World //打印语句 Console.WriteLine("Hello World"); //暂停 Console.ReadKey(); 数据类型 1.值类型 by ...

  9. Abp 领域事件简单实践 <二>

    上一篇说的是仓储增删改 的时候会自动触发领域事件. 其实也可以随时触发. 现在在应用层触发. 应用层依赖注入 EventBus public void Trigger() { var e = new ...

  10. Ubuntu 14.04 用户如何安装深度音乐播放器和百度音乐插件

    播放本地音乐或者收听国外的音乐电台,Ubuntu 14.04 自带的音乐播放器 Rhythmbox 完全能够满足,但是如果你想有像酷狗那样的国内播放器就需要折腾一下,还好有深度音乐播放器,这是一款完全 ...