题目描述 Description

  你可能听说过的Fibonacci数和圆周率Pi。

  如果你让这两个概念合并,一个新的深奥的概念应运而生:Pibonacci数。

  这些数可以被定义为对于x>=0:

    如果0<=x<4,则P(x) = 1

    如果4<=x,则P(x) = P(x - 1) + P(x - pi)

  其中Pi = 3.1415926535897...在这个问题中,你被要求计算对于一个给定的非负整数x对应P(x)的值。

输入描述 Input Description

  一个非负整数x。

输出描述 Output Description

  一个正整数P(x)。

样例输入 Sample Input

11

样例输出 Sample Output

20

数据范围及提示 Data Size & Hint

数据范围 x<=30000

来源 ICPC 2001 F

好题啊

转化题意,给你一个数,你可以一次减去1,或者减去pi,求你有多少种方法把它减到<4(如果它本来就小于4,方案就是1种)

想法1

枚举1的个数算出pi的个数,这是pi结尾的,算组合数

枚举pi的个数算出1的个数这是1结尾的,算组合数

然后加起来

眼瞎,以为只有3000,高兴地交上去,RE了,我靠竟然有30000,怎么办呢

问了问VFleaking,他想了想,帮我找出了一个有巨大优化空间的地方

我求组合数是暴力求的,其实枚举的时候组合数的n,m都是比较接近的,所以记一个lastn和一个lastm每次只要乘几个除几个就行了

然后优化到了10000左右可以过,又卡住了

FVleaking找到了差不多的题http://acm.hit.edu.cn/hoj/problem/view?id=1385

范围是3000,多组数据,我就交了,AC了,于是我的信心倍增,但是还是不知道怎么过30000

然后下了一个C++AC代码(当时也只有C和C++的)

看了以后果然是常数比我好

直接枚举pi的个数为n

然后给剩下的空间加上一个pi,算出这个空间可以容下多少个1,个数为m

可以想象,加上一个pi,pi的个数还是原来枚举的那么多(因为这个空间加上这些pi和1肯定还没满)

所以讨论1摆放情况,因为有可能1结尾,但是超出范围,根本不需要这个1,但是没关系这个方案只计算了一次也只会计算这一次,所以方案数就是C(n+m,n)

然后加上前面那个优化,就可以AC了..........

 const
h=;
type
aa=array[..]of int64;
var
a,b:aa;
n:longint; procedure cheng(x:longint);
var
i:longint;
begin
for i:= to b[] do
b[i]:=b[i]*x;
for i:= to b[] do
begin
inc(b[i+],b[i]div h);
b[i]:=b[i]mod h;
end;
i:=b[]+;
while b[i]> do
begin
inc(b[]);
b[i+]:=b[i]div h;
b[i]:=b[i]mod h;
inc(i);
end;
end; procedure jia;
var
i:longint;
begin
for i:= to b[] do
inc(a[i],b[i]);
if b[]>a[] then a[]:=b[];
for i:= to a[] do
begin
inc(a[i+],a[i]div h);
a[i]:=a[i]mod h;
end;
i:=a[]+;
while a[i]> do
begin
inc(a[]);
inc(a[i+],a[i]div h);
a[i]:=a[i]mod h;
inc(i);
end;
end; procedure chu(x:longint);
var
i:longint;
begin
for i:=b[] downto do
begin
inc(b[i-],(b[i]mod x)*h);
b[i]:=b[i]div x;
end;
b[]:=b[]div x;
while (b[b[]]=)and(b[]>) do
dec(b[]);
end; procedure print;
var
i:longint;
k:int64;
begin
write(a[a[]]);
for i:=a[]- downto do
begin
k:=h div ;
while k> do
begin
if a[i]<k then write();
k:=k div ;
end;
write(a[i]);
end;
end; procedure main;
var
i,j,k,last:longint;
begin
read(n);
if n< then
begin
write();
halt;
end;
dec(n,);
a[]:=;
a[]:=;
i:=;
b[]:=;
b[]:=;
i:=;
j:=trunc(n+pi);
while i<=trunc((n+pi)/pi) do
begin
last:=j;
j:=trunc(n+pi-i*pi);
for k:=last- downto j+ do
begin
cheng(k+);
chu(i+k);
end;
cheng(j+);
chu(i);
inc(i);
jia;
end;
print;
end; begin
main;
end.

3150 Pibonacci数 - Wikioi的更多相关文章

  1. 【wikioi】1227 方格取数 2(费用流)

    http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...

  2. 【wikioi】1907 方格取数3(最大流+最大权闭合子图)

    http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...

  3. 【wikioi】1553 互斥的数(hash+set)

    http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...

  4. [wikioi]数的划分

    http://wikioi.com/problem/1039/ 划分型DP.最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1]:如果没有1,那就都减1 ...

  5. wikioi 1166 矩阵取数游戏

    这题做了至少5个小时= =,虽然思路一开始就确定了,但是因为一些错误,比如dp公式里的+打成*,状态未初始化等原因调了好久(>_<) 最后还是参照着别人的解题报告找到错误. 大数模板直接拿 ...

  6. 【wikioi】1040 统计单词个数

    题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...

  7. 【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)

    http://wikioi.com/problem/1904/ 这题没看数据的话是一个大坑(我已报告官方修复了),答案只要求数量,不用打印路径...orz 最小路径覆盖=n-最大匹配,这个我在说二分图 ...

  8. 【wikioi】2216 行星序列(线段树)

    http://wikioi.com/problem/2216/ 这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!! 就是,pushdown一定要放在最前面!要不然顺序会错.也就是说,当 ...

  9. 【wikioi】1403 新三国争霸(dp+kruskal)

    http://wikioi.com/problem/1403/ 一开始的确感觉和bzoj1003很像,不同的是这里还要求联通,求最小的边. 我们可以想到用最小生成树(为嘛我自己想不到呢..) 我们可以 ...

随机推荐

  1. Nginx - HTTP Configuration, Module Variables

    The HTTP Core module introduces a large set of variables that you can use within the value of direct ...

  2. NAT地址转换原理全攻略

    NAT转换方式及原理 在NAT的应用中,可以仅需要转换内部地址(就是“内部本地址”转换成“内部全局地址”),这是最典型的应用,如内部网络用户通过NAT转换共享上网:也可以是仅需要转换外部地址(就是“外 ...

  3. HDOJ2024C语言合法标识符

    C语言合法标识符 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. asp.net字符串分割函数用法

    先来看个简单的实例 但是其数组长度却是25,而不是3.下面这种方法是先将“[111cn.net]”替换成一个特殊字符,比如$,在根据这个字符执行Split 例如下面我要根据[111cn.net]分割的 ...

  5. display的小故事

    实在是想不出来到底整个什么题目好..姑且先整这个吧.. 本文不是讲解display这个牛逼css属性的(讲不好才是真的!),主要是分享一下一些小Tips. display:table-cell wid ...

  6. class不想被复制的两个做法

    1,当一个class不想被复制的时候,可以将copy构造函数和copy assignment操作符声明为private.(只声明不定义,因此可以不指定函数参数) 2,或者,继承一个专门为了阻止copy ...

  7. C++ 文件读写方案选型

    严格来说, 有 3 种风格. UNIX 底层读写库 c 语言 stdio 标准库 iostream 流 一般的工程中, 底层读写库封装程度太低, 需要自己处理缓存和很多通用的异常场景. 不适合. 网络 ...

  8. Java 学习计划

    第一部分 在搭建SSM的过程中,可能会经常接触到一个叫maven的工具.这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识.在你目前这个阶 ...

  9. 一句话解释jquery中offset、pageX, pageY、position、scrollTop, scrollLeft的区别

    offset   元素相对文档的偏移 pageX, pageY 事件(鼠标)相对文档的偏移 注意:文档是指document, 而不是当前窗口,是包含了滚动位置的,即滚动条的位置对这些值是不产生影响的 ...

  10. php curl 伪造IP来源的代码分享

    php curl 可以模仿用户登录,还可以模仿用户IP地址.伪造IP来源. 1,curl发出请求的文件fake_ip.php: <?php $ch = curl_init(); $url = & ...