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]数列 解题报告的更多相关文章

  1. 洛谷 P1415 拆分数列 解题报告

    拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...

  2. 洛谷 P2597 [ZJOI2012]灾难 解题报告

    P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...

  3. 洛谷 P2173 [ZJOI2012]网络 解题报告

    P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...

  4. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  5. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  7. 洛谷 P2467 地精部落 解题报告

    P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

随机推荐

  1. 利用bootstrap实现图片Carousel效果

    引入头文件: <link rel="stylesheet" href="bootstrap.min.css"> <link rel=" ...

  2. PHP递归操作

    对于php的递归操作解释说明,递归基本上是学习每种语言都要会的最基本的操作.来吧,下面是我闲的时候随便写的一个对数组进行遍历操作的一个递归函数. 原理很简单,递归就是在一个函数里面调用自身的一种机制. ...

  3. 使用shell脚本依据分区信息分批次的下载hive表格数据

    今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上. 但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下 ...

  4. spider_main.py

    coding=UTF-8 import html_download import html_outputer import html_parser import url_maneger class S ...

  5. 20145202马超《Java程序设计》第十周学习总结

    一.网络编程 1.网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据 ...

  6. mysql安装与基本管理,mysql密码破解

    一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  7. 2753: [SCOI2012]滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 910 Descriptio ...

  8. interface in iOS

    lo = localhosten = ethernetap = Probably for access point (if you are acting as a wifi host) pdp_ip ...

  9. Eclipse 窗口说明---Eclipse教程第03课

    Eclipse 工作台(Workbench) 首先,让我们来看一下Eclipse 作台用户界面,和它里面的各种组件. 工作台是多个窗口的集合.每个窗口包含菜单栏,工具栏,快捷方式栏,以及一个或者多个透 ...

  10. 《Cracking the Coding Interview》——第7章:数学和概率论——题目1

    2014-03-20 01:57 题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中.你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高? 解法:第一种总是胜率更高,可以列不等式算算,结 ...