CodeAction_beta02 斐波那契

用第1个,第2个...第N个斐波那契数构成一个长度为P的序列,每个斐波那契数可以使用任意多次,但至少要使用一次,并且序列中任意两个相同的斐波那契数之间至少要隔着 M 个数, 求满足条件的序列组成方法有多少种?输出答案对1e9+7取模.

记\(fib[i]\)表示第i个斐波那契数,\(fib[0]=fib[1]=1\),\(fib[i]=fib[i?1]+fib[i?2](i>1)\).

分析:本来标题是想叫做"与fib完全无关的一道fib题".不过个人认为这的确是道思维好题.

因为题目说了所有数都要出现至少一次 所以只需考虑其组合而不用考虑其排列 最后乘个n!就是答案.(意思就是可以当做这 N 个数是无序的)所以说本题与fib无关,你就当做题目给你了n个数就行了.

设\(f[i][j]\)表示序列前i个放了j种数的方案数.考虑放第i+1个时的状态转移.

不难想到,此时我们有两种选择.

(1)放一个新的数,则状态转移为\(f[i+1][j+1]\)

(2)放一个之前已经出现过的数,则状态转移为\(f[i+1][j]\)

对于第一种情况,有\(f[i+1][j+1]+=f[i][j]\);

对于第二种情况,因为"序列中任意两个相同的斐波那契数之间至少要隔着M个数",所以序列末尾的M种数是不可以放的,则有\(f[i+1][j]+=f[i][j]*(j-m)\)

注意一边算一边取模,然后"十年oi一场空,不开long long..."

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){s=s*10+ch-‘0‘;ch=getchar();}
    return s*w;
}
const int mod=1e9+7;
int n,m,p;
ll ans,f[2005][2005];
int main(){
    n=read();m=read();p=read();
    f[0][0]=1;
    for(int i=0;i<=p;i++)
    for(int j=0;j<=n;j++){
        f[i+1][j+1]+=f[i][j]%mod;
        if(j>m)f[i+1][j]=(f[i+1][j]+f[i][j]*(j-m))%mod;
    }
    ans=f[p][n]%mod;
    for(int i=1;i<=n;i++)
    ans=(ans*i)%mod;
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/PPXppx/p/10322496.html

时间: 2024-08-30 17:08:56

CodeAction_beta02 斐波那契的相关文章

实现斐波那契神兔

1.用循环实现不死神兔 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契. 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔, 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡, 问:一对刚出生的兔子,一年内繁殖成多少对兔子? 1 1 2 3 5 8 13 21 1 import java.util.Arrays; 2 3 public class Tu { 4 5 public static void main(String

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

斐波纳契数之组合

斐波纳契数之组合 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 145(66 users) Total Accepted: 83(65 users) Rating: Special Judge: No Description 斐波那契数列是这么定义的:F0 = 1, F1 = 1, F2 = F1 + F0,··· Fn = Fn-1 + Fn-2(n>=2),对于每一项,它们都是斐波那契数. 现在给出一个整数d,求一个组合使得a

NYOJ 698 A Coin Problem (斐波那契)

链接:click here 题意: 描述 One day,Jiameier is tidying up the room,and find some coins. Then she throws the coin to play.Suddenly,she thinks of a problem ,that if throw n times coin ,how many situations of no-continuous up of the coin. Hey,Let's solve the

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

求斐波那契数的python语言实现---递归和迭代

迭代实现如下: def fab(n): n1 = 1 n2 = 1 if n<1: print("输入有误!") return -1 while (n-2)>0: n3 = n2+n1 n1 = n2 n2 = n3 n-=1 return n3 number = int(input("请输入要求的斐波那契数的第几个数:")) result = fab(number) print(result) 递归实现如下: def fab(n): if n==1 o

OJ_1064.计算斐波那契第n项

1064. 计算斐波那契第n项 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 输入n,编写程序输出斐波那契数列的第n项.其中斐波那契数列f(n)的定义如下: f(1)=0,f(2)=1         f(n)=f(n-1)+f(n-2)(n>=2) 输入 一行一个正整数n. 输出 输出一个数f(n). 样例输入 5 样例输出 3 数据范围限制 1<=n<=30 1 #include<cstdio> 2 #include&

《剑指Offer》题目——斐波拉契数列

题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.(n<=39) 题目分析:如果使用简单的递归,很容易造成栈溢出.采用递推的方式即可. 代码: public class Fibonacci { public static int fibonacci(int n){ int res[] = new int[2]; res[0]=1; res[1]=1; int temp = 0; if(n==0) return 0; if(n<=2) return res[

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为