FZOJ 1640 place blocks

OJ题目 :click here ~~

题目分析:转自

sentimental_man的博客

不知道为什么csdn不让给出这篇博文的网址,只能这样啦,感谢原作者的辛勤劳动。下面都是来自这篇博文。

1.对于本题的递推式很简单 f[i]=2*f[i-2]+f[i-1]

2.本题有个地方很奇怪就是最后结果要对2^64取余,这样的就无法一边算一边取余,因为会越界,也不太可能用高精度

3.那该怎么做呢?因为是对2^64(1<<64)取余,所以我们先把前几项算出来的结果看看:

          f[i]    二进制

i=1         1          1

i=2         3         11

i=3         5        101

i=4         11      1011

i=5         21     10101

i=6         43    101011

i=7         85   1010101

……       ……     ……

发现什么没有,二进制的位数等于i的值,对于所有的f[i]值前缀都是1和0交替(除了最后两位)

如果i是奇数:最后两位为01;

如果i是偶数:最后两位为11;

当i是63的时候为 1010101……01

当i是64的时候为 1010101……11

此时取余的结果还都是他们本身。

当i大于64时候,取余的结果就是把从右往左数大于64的位全部去掉,保留低64位。根据上面的规律

很容易知道单i是奇数时,f[i]=f[63] 当i是偶数时f[i]=f[64] (i>64)

AC_CODE

typedef unsigned long long  LL ;
const int Max_N = 65;
LL F[Max_N];
int main()
{
    int N;
    int i , j , k;
    F[1] = 1;
    F[2] = 3;
    for(i = 3;i <= Max_N;i++){
        F[i] = 2 * F[i - 2] + F[i - 1];
    }
    while(scanf("%d",&N) != EOF){
        if(N <= 64) printf("%I64u\n",F[N]);
        else printf("%I64u\n",F[63 + (N + 1)%2]);
    }
    return 0;
}

FZOJ 1640 place blocks,布布扣,bubuko.com

时间: 2024-12-28 23:05:08

FZOJ 1640 place blocks的相关文章

【Code::Blocks】windows 环境下编译 Code::Blocks(已修正)

Code::Blocks 在2012-11-25发布了最新的12.11版本,相比上一个版本(10.05),Code::Blocks 进行了许多改进和更新(Change log). 引用 Wikipedia:Code::Blocks: Code::Blocks是一个免费.开源.跨平台的IDE,使用C++开发,并且使用wxWidgets做为GUI函式库.Code::Blocks使用了插件架构,其功能可以使用插件自由地扩充.目前, Code::Blocks主要针对开发C/C++程式而设计. Code:

Using ffmpeg libraries in Code::Blocks

I am digging into a project that needs to use some open source video codec library. ffmpeg is very powerful video codec library, which I decided to use in my project. I compiled and installed the ffmpeg library, then the problem comes, how to use the

BZOJ 2086: [Poi2010]Blocks

2086: [Poi2010]Blocks Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 494  Solved: 222[Submit][Status][Discuss] Description 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数

令Code::Blocks支持C++11特性

GNU 4.7.0以上的版本可以支持C++11新特性,因此可采用集成了这样的编译器的Code::Blocks.这里下载:http://pan.baidu.com/s/1ntGGpBz 文件名:codeblocks-13.12mingw-setup.exe,在CodeBlocks官网上也能找到其下载地址. 不过,下载完后还需要进行一个设置才能开启C++11新特性.选择setting->compiler,先到Toolchain executables选项卡下,看MinGW的路径是否正确.如图: 然后

Code::Blocks配置GTK+2和GTK+3

Code::Blocks配置GTK+2和GTK+3 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 GPLv3 许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html 本文档根据GNU Free Documentation License 1.3发布 GFDL1.3许可证的副本可以在这里获得:http:

bc.34.B.Building Blocks(贪心)

Building Blocks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 751    Accepted Submission(s): 164 Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build block

Winter-2-STL-D The Blocks Problem 解题报告及测试数据

Time Limit:3000MS     Memory Limit:0KB Description Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world i

BZOJ2086: [Poi2010]Blocks

题解: 想了想发现只需要求出最长的一段平均值>k即可. 平均值的问题给每个数减去k,判断是否连续的一段>0即可. 然后我们发现如果i<j 且 s[i]<s[j],那么 j 对于l>j不会比i 优. 那我们就可以维护一个单调的s[i],然后对于每个l去二分出它的答案. 但这样会T. 再次考虑单调性. 如果 l>j,且s[l]>s[i],那么我们的答案最小也是l-i,所以j必须取比i小的s才有可能更新答案.然后就可以两个指针扫一遍了. 好吧 我承认我口胡... 代码:

1640: [Usaco2007 Nov]Best Cow Line 队列变换

1640: [Usaco2007 Nov]Best Cow Line 队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 543  Solved: 278[Submit][Status] Description FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of e