首页 > 试题广场 >

二维斐波那契数列

[编程题]二维斐波那契数列
  • 热度指数:7316 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}二维斐波那契数列满足以下递推式:

\begin{cases}<br />a_{i,j} = 1,&(i,j \in \{1\}) \\<br />a_{i,j} = a_{i-1,j},&(i \ge 2,j \in \{1\}); \\<br />a_{i,j} = a_{i,j-1},&(j \ge 2,i \in \{1\}); \\<br />a_{i,j} = a_{i-1,j} + a_{i,j-1},&(i,j \ge 2)<br />\end{cases}

\hspace{15pt}给定正整数 n,m,求 a_{n,m} 的值。由于结果可能很大,请输出 a_{n,m}10^9+7 取模后的结果。

输入描述:
\hspace{15pt}在一行中输入两个正整数 n,m1 \leqq n,m \leqq 10^3),分别表示行下标和列下标。


输出描述:
\hspace{15pt}输出一个整数,表示 a_{n,m}\bmod(10^9+7) 的值。
示例1

输入

1 1

输出

1

说明

根据定义,a_{1,1}=1
示例2

输入

2 2

输出

2

说明

由递推可得:a_{2,1}=a_{1,1}=1a_{1,2}=a_{1,1}=1

a_{2,2}=a_{1,2}+a_{2,1}=1+1=2

备注:
\hspace{15pt}提示,取模运算对加法运算满足交换律和结合律,所以在计算过程中多次取模得到的计算结果,和全部计算都完成后得到的计算结果是相同的。
n,m = map(int, input().split())
r_pre : list = [1]
r_cur : list = [1]

for i in range(m - 1):
    r_pre.append(1)
for j in range(n - 1):
    for i in range(m - 1):
        r_cur.append(r_cur[i] + r_pre[i + 1])
    r_pre = r_cur.copy()
    r_cur = [1]
print(r_pre[m - 1] % (10**9 + 7))

发表于 2025-07-25 01:22:22 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int mod = (int) Math.pow(10, 9) + 7;
        int[][] nums = new int[n+1][m+1];
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                if (i == 0 || j == 0) {
                    nums[i][j] = 0;
                } else if (i == 1 && j == 1) {
                    nums[i][j] = 1;
                } else {
                    nums[i][j] = (nums[i-1][j] % mod + nums[i][j-1] % mod) % mod;
                }
            }
        }
        System.out.println(nums[n][m]);
        in.close();
    }
}

发表于 2025-07-23 23:41:41 回复(0)
import numpy as np
n, m = map(int, input().split())
a = np.zeros((max(n, m), max(n, m)))
a[0, 0] = 1
for i in range(max(n, m)-1):
    i = i + 1
    for j in range(i):
        if j == 0:
            a[i, j] = 1
            a[j, i] = 1
        else:
            a[i, j] = a[i-1, j] + a[i, j-1]
            a[j, i] = a[i, j]
    a[i, i] = a[i-1, i] + a[i, i-1]
print(int(a[n-1, m-1]) % (10 ** 9 + 7))
程序异常退出, 请检查代码"是否有数组越界等异常"或者"是否有语法错误"
Traceback (most recent call last):
File "/tmp/a.py3", line 1, in
import numpy as np
ModuleNotFoundError: No module named 'numpy'

发表于 2025-07-23 11:25:19 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        long [][]arr=new long[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(i==0 || j==0){arr[i][j]=1;}
            }
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                arr[i][j]=(arr[i-1][j]+arr[i][j-1])%1000000007;
            }
        }
        long num = arr[n-1][m-1];
        System.out.println(num);
    }
}
发表于 2025-07-19 15:19:19 回复(0)
注意最后对1000000007取模,不然得数不对。
import sys
n,m = map(int,input().split())
s=[[1]*m for _ in range(n)]
if n == 1 or m == 1:
    print(1)
else:
    for i in range(1,n):
        for j in range(1,m):
            s[i][j] = s[i-1][j]+s[i][j-1]
    print(int((s[n-1][m-1])%1000000007))


发表于 2025-07-15 18:27:00 回复(0)
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
long long a[1001][1001]; 

int main(){
    int n, m; 
    cin >> n >> m; 

    for(int i = 1; i <= n; i++){ 
        for(int j = 1; j <= m; j++){ 
            if(i == 1 && j == 1) a[i][j] = 1; 
            else if(i == 1) a[i][j] = a[i][j - 1]; 
            else if(j == 1) a[i][j] = a[i - 1][j]; 
            else a[i][j] = (a[i - 1][j] + a[i][j - 1]) % MOD; 
        }
    }
    
    cout << a[n][m] % MOD;
}

发表于 2025-07-15 15:21:48 回复(0)
n, m = map(int, input().split())
mod = 10**9 + 7

a = [[0] * (m+1) for _ in range (n+1)]

a[1][1] = 1

for i in range (2, n+1):
    a[i][1] = a[i-1][1]

for j in range (2, m+1):
    a[1][j] = a[1][j-1]

for i in range (2, n+1):
    for j in range (2, m+1):
        a[i][j] = (a[i-1][j] + a[i][j-1]) % mod

print(a[n][m])
发表于 2025-07-15 02:23:56 回复(0)
import math
a,b=map(int,input().split())
if a ==1 or b == 1:
    print(1)
else:
    a=a-1
    b=b-1
    c=a+b
    m=math.factorial(a)
    n=math.factorial(b)
    p=math.factorial(c)
    s=p/(m*n)
    s=int(s)
    s=s%(1000000007)
    print(s)

发表于 2025-07-13 14:56:19 回复(1)
#include <stdio.h>

#define MOD 1000000007

int main()
{
    int arr[1000][1000] = {0};
    int n = 0, m = 0;
    int i = 0, j = 0;
    scanf("%d %d", &n, &m);
    
    // 初始化第一列
    for (i = 0; i < n; i++)
    {
        arr[i][0] = 1;
    }
    
    // 初始化第一行
    for (i = 0; i < m; i++)
    {
        arr[0][i] = 1;
    }
    
    // 填充剩余部分
    for (i = 1; i < n; i++)
    {
        for (j = 1; j < m; j++)
        {
            arr[i][j] = (arr[i-1][j] + arr[i][j-1]) % MOD;
        }
    }
    
    printf("%d\n", arr[n-1][m-1]);
    
    return 0;
}

发表于 2025-07-11 15:01:45 回复(0)
from operator import mod
# 防止后续整数太大,所以取模进行运算
MOD = 10**9 + 7

# 读取输入
n, m = map(int, input().split())

# 初始化二维数组
a = [[0] * m for _ in range(n)]

# 设置边界条件
for i in range(n):
    a[i][0] = 1
for j in range(m):
    a[0][j] = 1

# 填充二维数组
for i in range(1, n):
    for j in range(1, m):
        a[i][j] = (a[i-1][j] + a[i][j-1]) % MOD

# 打印结果
print(a[n-1][m-1])

发表于 2025-07-01 09:47:14 回复(0)
# 1
# n, m = map(int, input().split())
# MOD = 10**9+7
# def fib(n,m):
#     L = [[1 for _ in range(1, m+1)] for _ in range(1,n+1)]
#     for i in range(1,n):
#         for j in range(1, m):
#             L[i][j] = (L[i-1][j] +L[i][j-1])%MOD
#     return L[n-1][m-1]

# print(fib(n, m))

# 2
n, m = map(int, input().split())
MOD = 10**9+7
def fib(n,m):
    DP_row = [1 for _ in range(1,m+1)]
    DP_pillar = 1

    for i in range(1, n):
        for j in range(1, m):
            DP_row[j] = (DP_row[j]+DP_pillar)%MOD
            DP_pillar = (DP_row[j])%MOD
        DP_cow = 1
   
    return DP_row[m-1]

print(fib(n, m))
发表于 2025-06-17 02:27:49 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        final int MOD = 1000000007;
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int m = in.nextInt();
            long [][] Sl = new long[n][m];

            for(int j = 0;j < m;j++){
                Sl[0][j] = 1;
            }
            for(int i = 0;i < n;i++){
                Sl[i][0] = 1;
            }
            for(int i = 1;i < n;i++){
                for(int j = 1;j < m;j++){
                    Sl[i][j] = (Sl[i - 1][j] + Sl[i][j - 1]) % MOD;//注意在每次赋值时取模,最后输出时取模在下标较大时会造成溢出
                }
               
            }
            System.out.println(Sl[n - 1][m - 1]);
        }
    }
}
发表于 2025-06-09 16:00:56 回复(0)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e3 + 5, INT = 1e9 + 7;

ll cnt[N][N];

ll Dfs(int x, int y)
{
    if(cnt[x][y]) return cnt[x][y];

    if(x == 1 && y == 1) return cnt[x][y] = 1;
    if(y == 1) return cnt[x][y] = Dfs(x - 1, y) % INT;
    if(x == 1) return cnt[x][y] = Dfs(x, y - 1) % INT;
    return cnt[x][y] = (Dfs(x - 1, y) + Dfs(x, y - 1)) % INT;  

}
int main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n, m; cin >> n >> m;

    cout << Dfs(n, m) << "\n";

    return 0;    
} 
发表于 2025-05-30 15:27:29 回复(0)
MOD = 10**9 + 7

def solve(n, m):
    max_n = n + m - 2
    # Precompute factorial and inverse factorial up to max_n
    fact = [1] * (max_n + 1)
    inv_fact = [1] * (max_n + 1)
    
    for i in range(1, max_n + 1):
        fact[i] = fact[i-1] * i % MOD
    
    inv_fact[max_n] = pow(fact[max_n], MOD - 2, MOD)
    for i in range(max_n - 1, -1, -1):
        inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD
    
    a = n + m - 2
    b = n - 1
    if b < 0&nbs***bsp;b > a:
        return 0
    res = fact[a] * inv_fact[b] % MOD
    res = res * inv_fact[a - b] % MOD
    return res

n, m = map(int, input().split())
print(solve(n, m))


编辑于 2025-05-27 17:33:30 回复(0)
# 超时是怎么回事
import sys

n, m = input().split()

n = int(n)
m = int(m)

def fib(nv, mv):
    if nv == 1 and mv == 1:
        return 1
    if nv == 1:
        return fib(1, mv - 1)
    if mv == 1:
        return fib(nv - 1, 1)
    return fib(nv-1, mv) + fib(nv, mv-1)

print(fib(n,m) % (10^9+7))

发表于 2025-05-27 14:01:51 回复(4)