列表

详情


NC214741. 蝴蝶翅膀的发散

描述

一只南美洲亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可能在两周后在美国德克萨斯引起一场龙卷风。美国气象学家洛伦兹将这种现象称为“蝴蝶效应”。
为了直观地体现蝴蝶效应,“未来道具研究所”开展了一项实验。实验环境由n个风力测试装置组成。初始时,每个装置的风力强度为0。
装置1中有一只蝴蝶,当它扇动翅膀时,装置1将会产生强度为1的风力。实验环境中的各个装置具有关联性,当编号为 i(i>1) 的装置的风力强度为编号在 [max(i-d,1),i-1] 区间的装置的风力强度之和。
请问,当装置1中的蝴蝶扇动翅膀时,装置 n 的风力强度为多少?为防止答案过大整数溢出,答案对1e9+7取模。

输入描述

输入仅一行,包括两个整数 ,含义如上文。

输出描述

输出一个整数表示答案。

示例1

输入:

278 976

输出:

511821710

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 15ms, 内存消耗: 504K, 提交时间: 2020-12-26 16:26:13

#include <stdio.h>

int main()
{
	int n,d;
	scanf("%d%d",&n,&d);
	long long a[10010]={0,1,1},b[10010]={0,1};
	int i;
	for(i=3;i<=n;i++){
		int max=(i-d>1)?i-d:1;
		for(int j=max;j<=i-1;j++)
		  b[i]+=a[j]%1000000007;
		a[i]=b[i];
	}
	printf("%d",(b[n]+1000000007)%1000000007);
	return 0;
}

C++(clang++11) 解法, 执行用时: 40ms, 内存消耗: 528K, 提交时间: 2021-01-22 15:04:22

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[10010];
const int p=1e9+7;
int main()
{
	int n,d;
	scanf("%d%d",&n,&d);
	f[1]=1;
	for(int i=2;i<=n;i++)
	{
		int k=max(i-d,1);
		for(int j=k;j<=i-1;j++)
		f[i]+=f[j],f[i]%=p;
	}
	cout<<f[n];
}

Python3(3.9) 解法, 执行用时: 40ms, 内存消耗: 16760K, 提交时间: 2020-12-26 12:28:17

a = [0] * 10007
pre = [0] * 10007
MOD = 10**9 + 7

n, d = map(int, input().split())
a[1] = pre[1] = 1

for i in range(2, n + 1):
    l, r = max(i - d, 1), i - 1
    a[i] = pre[r] - pre[l - 1]
    pre[i] = a[i] + pre[i - 1]

print(a[n] % MOD)

上一题