洛谷 P2609 [ZJOI2012]数列 解题报告
P2609 [ZJOI2012]数列
题目描述
小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式:
A(0)=0
A(1)=1
A(2i)=A(i) (对于任意 i>0)
A(2i+1)=A(i)+A(i+1) (对于任意 i>0)
小白作为一个数学爱好者,很快就计算出了这个数列的通项公式。于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来。于是小白为了向小蓝证明自己的确做出来了此题以达到其炫耀的目的,想出了一个绝妙的方法:即让小蓝说一个正整数N,小白则说出 的值,如果当N很大时小白仍能很快的说出正确答案,这就说明小白的确得到了公式。但这个方法有一个很大的漏洞:小蓝自己不会做,没法验证小白的答案是否正确。作为小蓝的好友,你能帮帮小蓝吗?
输入输出格式
输入格式:
输入文件第一行有且只有一个正整数T,表示测试数据的组数。
第2~T+1行,每行一个非负整数N。
输出格式:
输出文件共包含T行。
第i行应包含一个不含多余前缀0的数,它的值应等于 (n为输入数据中第i+1行被读入的整数)
说明
对于20%的数据,N<=10^8
对于50%的数据,N<=10^12
对于100%的数据,T<=20,N<=10^100
说实话,我觉得好迷。。
胡乱推了推没搞出来。。
发现直接暴力记搜就可以了,发现每层出现的不一样的数非常少,是常数级别的
我们可以直接高精,记搜用个map搞一搞
复杂度:\(O(Tlog_{10}N(loglogN+logN))\)
对应数据组数,比较或者运算复杂度,map的复杂度和运算次数
(我瞎扯的
Code:
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int N=102;
struct l_num
{
int num[N];
l_num()
{
memset(num,0,sizeof(num));
}
l_num(char c[])
{
memset(num,0,sizeof(num));
num[0]=strlen(c);
for(int i=1;i<=num[0];i++)
num[i]=c[num[0]-i]-'0';
}
bool friend operator <(l_num n1,l_num n2)
{
if(n1.num[0]==n2.num[0])
{
int pos=n1.num[0];
while(pos&&n1.num[pos]==n2.num[pos]) --pos;
return n1.num[pos]<n2.num[pos];
}
return n1.num[0]<n2.num[0];
}
l_num friend operator /(l_num n,int k)
{
for(int i=n.num[0];i>1;i--)
{
if(n.num[i]&1) n.num[i-1]+=10;
n.num[i]>>=1;
}
n.num[1]>>=1;
n.num[1]+=k;
if(!n.num[n.num[0]]) --n.num[0];
return n;
}
l_num friend operator +(l_num n1,l_num n2)
{
l_num n3;
n3.num[0]=max(n1.num[0],n2.num[0]);
for(int i=1;i<=n3.num[0];i++)
{
n3.num[i]+=n1.num[i]+n2.num[i];
n3.num[i+1]=n3.num[i]/10;
n3.num[i]%=10;
}
if(n3.num[n3.num[0]+1]) ++n3.num[0];
return n3;
}
}zero,one;
map <l_num,l_num> a;
l_num dfs(l_num k)
{
if(!k.num[0]) return zero;
if(k.num[0]==1&&k.num[1]==1) return one;
if(a.find(k)!=a.end()) return a[k];
if(k.num[1]&1) a[k]=dfs(k/0)+dfs(k/1);
else a[k]=dfs(k/0);
return a[k];
}
int main()
{
int t;char s[N];
scanf("%d",&t);
one.num[0]=one.num[1]=1;
zero.num[0]=0;
while(t--)
{
scanf("%s",s);
l_num rk(s);
l_num ans=dfs(rk);
for(int i=ans.num[0];i;i--)
printf("%d",ans.num[i]);
printf("\n");
}
return 0;
}
2018.9.3
洛谷 P2609 [ZJOI2012]数列 解题报告的更多相关文章
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P2467 地精部落 解题报告
P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
随机推荐
- C/C++程序基础 (十一)标准模板库
标准模板库 标准模板库在标准函数库的定位 迭代器(类似指针)保证算法(常用算法)和容器(数据结构)的结合. vector的实现 底层实现是动态数组,所以支持随机访问. 内部是动态数组,随着insert ...
- linux mysql5.7 安装、 开机启动
一.安装 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz h ...
- 神经网络系列学习笔记(一)——神经网络之ANN学习资料汇总
ANN tutorial: http://adventuresinmachinelearning.com/neural-networks-tutorial/ https://www.cs.toront ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- C语言实例解析精粹学习笔记——29
题目: 将字符行内单字之间的空格平均分配插入到单字之间,以实现字符行排版.也就是输入一个英文句子,单词之间的空格数目不同,将这些空格数平均分配到单词之间,重新输出. 代码如下(是原书中配套的代码,只是 ...
- B-树 动机与结构
Ps.我们遵循从感性到理性的认知顺序来逐步探索B-树的奥秘,之前经常说的value这里用key(关键码)指代,因为可能存的是字符串,说是value就不合适了. (多图预警!!!建议在WI-FI下观看) ...
- CF797E. Array Queries
a is an array of n positive integers, all of which are not greater than n. You have to process q que ...
- mysql学习第三天练习(日期和时间函数)
-- 日期和时间函数 -- 获取当前日期 select curdate(),current_date() from dual -- 返回服务器当前的日期和时间 select NOW(),SYSDATE ...
- Android 意图通用类 IntentUrl
1.整体分析 1.1.源代码如下,可以直接Copy. public class IntentUtil { /** * 打开链接 * 根据设置判断是用那种方式打开 * * @param context ...
- 7.Mongodb安全性流程
1.安全性流程 2.超级管理员 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户 采用了角色-用户-数据库的安全管理方式 常用系统角色如下: root:只 ...