3150 Pibonacci数 - Wikioi
题目描述 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的更多相关文章
- 【wikioi】1227 方格取数 2(费用流)
http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...
- 【wikioi】1907 方格取数3(最大流+最大权闭合子图)
http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...
- 【wikioi】1553 互斥的数(hash+set)
http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...
- [wikioi]数的划分
http://wikioi.com/problem/1039/ 划分型DP.最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1]:如果没有1,那就都减1 ...
- wikioi 1166 矩阵取数游戏
这题做了至少5个小时= =,虽然思路一开始就确定了,但是因为一些错误,比如dp公式里的+打成*,状态未初始化等原因调了好久(>_<) 最后还是参照着别人的解题报告找到错误. 大数模板直接拿 ...
- 【wikioi】1040 统计单词个数
题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...
- 【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)
http://wikioi.com/problem/1904/ 这题没看数据的话是一个大坑(我已报告官方修复了),答案只要求数量,不用打印路径...orz 最小路径覆盖=n-最大匹配,这个我在说二分图 ...
- 【wikioi】2216 行星序列(线段树)
http://wikioi.com/problem/2216/ 这题太让我感动了QAQ,让我找到了我一直以来写线段树的错误!!!! 就是,pushdown一定要放在最前面!要不然顺序会错.也就是说,当 ...
- 【wikioi】1403 新三国争霸(dp+kruskal)
http://wikioi.com/problem/1403/ 一开始的确感觉和bzoj1003很像,不同的是这里还要求联通,求最小的边. 我们可以想到用最小生成树(为嘛我自己想不到呢..) 我们可以 ...
随机推荐
- Linux 命令 - chmod: 更改文件模式
文件的模式 当使用 ls -l 命令查看目录内容时 [huey@huey-K42JE cmdline]$ ls -l /etc/passwd -rw-r--r-- 1 root root 1917 J ...
- sql常识-BETWEEN 操作符
BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. SQL BETWEEN 语法 SELECT column_name(s ...
- Error This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. T
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuG ...
- Viewpager+Fragment出现空白页面的问题
写了三个Fragment,一次点击跳转显示正常,如果从第一个直接跳转到第三个,第三个页面会出现空白界面. 问题找到了:原来动态获取数据页面数据不显示,页面显示空白,就是onCreateView每次都调 ...
- 【转】用capability 特征加强Linux系统安全
用capability 特征加强Linux系统安全 摘要:传统UNIX系统的访问控制模型非常简单——普通用户对超级用户.在这种模型中,一个进程或者帐户要么只有很小的权限,要么具有全部的系统权限.显然, ...
- Tab 防刷新
今天发现项目中有个小毛病,就是tab老是刷新,就上网Copy了一份防止刷新的Tab例子,谢咯. 贴上来参考一下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Html.ActionLink 几种重载方式说明及例子
本文整理了该方法的几种重载形式:一 Html.ActionLink("linkText","actionName")该重载的第一个参数是该链接要显示的文字,第二 ...
- (转)Linux下tomcat JVM内存设置步骤
java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space -------------- ...
- docker & nodejs & mongodb
Nodejs 应用简单的访问Mongodb 部署至Docker 1.本地简单的写能运行起来的一个nodejs (demo可写的更简单 一个post一个get即可) schemas user.js v ...
- 关于remote访问中的flex端配置问题
刚刚开始使用blazeds可能会有个疑问.tomcat服务器是必须配置的吗?如果前台后台分开,怎么开发. 其实服务器不是必须配置的,配置了那个服务器,就会在“附加编译参数”加入这样一句: -servi ...