博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2660: [Beijing wc2012]最多的方案
阅读量:5141 次
发布时间:2019-06-13

本文共 1031 字,大约阅读时间需要 3 分钟。

这题意。。。注意不同的方案中不能有相同的斐波那契数中的相同指的是完全相同,就是一个不一样就行了

思维题

fib增长得很快,92就爆LL了

我们考虑用一个01串表示第几个斐波那契数是否选

对于一个合法的方案,可以通过令一个位的1变成0,再令下两位的0变成1的方式变成另一个方案

我们可以求出二进制最大的01串,然后不停消位

先得到一个p数组,表示那些位是1,这个是由大到小的

f[i][0/1]表示枚举到第i个位是1的位置,这个位置选不选

容易有f[i][1]=f[i+1][1]+f[i+1][0]

因为第i个斐波那契数只用前面的斐波那契数表示,总的方案数为(i-1)/2,所以

f[i][0]=f[i+1][1]*((p[i]-p[i+1]-1)/2)+f[i+1][0]*((p[i]-p[i+1])/2)

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;LL fib[110];int len,p[110];LL f[110][2];int main(){ fib[1]=1;fib[2]=2; for(int i=3;i<=90;i++)fib[i]=fib[i-1]+fib[i-2]; LL n; scanf("%lld",&n); for(int i=90;i>=1;i--) if(n>=fib[i])n-=fib[i],p[++len]=i; f[len][0]=(p[len]-1)/2,f[len][1]=1; for(int i=len-1;i>=1;i--) { f[i][0]=f[i+1][1]*((p[i]-p[i+1]-1)/2)+f[i+1][0]*((p[i]-p[i+1])/2); f[i][1]=f[i+1][1]+f[i+1][0]; } printf("%lld\n",f[1][0]+f[1][1]); return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/10235459.html

你可能感兴趣的文章
安装 Express
查看>>
存储(硬件方面的一些基本术语)
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
Java泛型的基本使用
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Postman-----如何导入和导出
查看>>
【Linux】ping命令详解
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
【模板】最小生成树
查看>>
java面试题
查看>>
pair的例子
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
Oracle中包的创建
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>