题目描述 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. css3 背景记

    css3 背景 css背景主要包括五个属性: background-color background-color:transparent || <color> 用来设置元素的背景颜色,默认 ...

  2. Connection to https://dl-ssl.google.com refused 解决方案

    源  起 由于国内不能直接访问Google设在国外的服务器,因此更新Android SDK的时候会遇到 refused 的情况,在命令行ping dl-ssl.google.com显示“请求超时”,解 ...

  3. asp网站发布步骤总结

    1.在VS2012中打开索要发布的网站,初始页可重命名为index.html或default.apx. 2.点击  生成>生成“网站”,然后“发布网站”. 3.进行发布设置: (1 配置文件 ( ...

  4. 【转】MySQL的安装与配置

    一.MySQL的安装 1.在线安装: 命令:sudo apt-get install mysql-server 在安装的过程中将提示为“root”用户设置密码,输入自己的密码即可,安装按成后已自动配置 ...

  5. 第十篇、Swift -- WebSocket

    每当小编再开发中遇到了困难,在网上搜,简直是垃圾堆里找金子.国内网站真的全不可靠,最后FQ去国外网站寻找,才可以找到.找到了写websocket文章,同时找到了集成的框架文件,一个叫Starscrea ...

  6. javascript笔记——闭包

    花了三天时间,终于弄清楚闭包的各种写法和注意的事项,以及以前写,经常出错的地方,特此做一个总结,虽然不够专业,但是对于那些初学者来说,绝对对闭包的理解事半功倍. 案例一: function aa(){ ...

  7. EFFECTIVE JAVA 第十一章 系列化

    EFFECTIVE  JAVA  第十一章  系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...

  8. 动态链接库加载出错:cannot restore segment prot after reloc: Permission denied

    在执行可执行程序时,出现动态链接库加载出错:cannot restore segment prot after reloc: Permission denied. 主要是由于Linux 内核中提供的强 ...

  9. [android]netd与NetworkManagementService初印象

    [功能]Netd是什么,主要负责什么功能 为什么这次会接触Netd主要是因为在设置防火墙时候碰到了.关于Netd可以干什么可以从Netd的源码中CommandListener中得到答案.按照我的理解, ...

  10. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...