tsinsen A1067. Fibonacci数列整除问题 dp

本题探讨了在指定范围内的Fibonacci数列中寻找那些数不是给定四个数的倍数的问题。通过预计算Fibonacci数列,并使用动态规划的方法来检查每个数是否为a、b、c、d的倍数,最终输出符合条件的Fibonacci数的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A1067. Fibonacci数列整除问题
时间限制: 1.0s   内存限制:512.0MB  
总提交次数: 2796   AC次数: 496   平均分: 51.83
将本题分享到:
   
 
问题描述
  已知四个数:a,b,c,d,判断在第s个Fibonacci数到第t个Fibonacci数之间哪些数既不是a也不是b也不是c也不是d的倍数。
输入格式
  第一行两个数,s,t,表示要判断第s个Fibonacci数到第t个Fibonacci数之间(包含第s个和第t个)的Fibonacci数。
  第二行四个数,a,b,c,d,意义如题目描述。
输出格式
  一行若干个数,A1,A2,A3...An,从小到大排列,表示第Ai个Fibonacci数既不是a也不是b也不是c也不是d的倍数。
  每两个数之间用空格隔开。
样例输入
1 5
2 3 5 7
样例输出
1 2
数据规模和约定
  1<=s<=t<=10000, 1<=a,b,c,d<=10000
 
dp[i][j]表示第i个数取第j个数的余数
转移方程 dp[i][j]=(dp[i-1][j]+dp[i-2][j])%a[j]
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 10001
#define eps 1e-9
const int inf=0x7fffffff;   //无限大
int main()
{
    int f[maxn];
    f[1]=1;
    f[2]=1;
    for(int i=3;i<=10000;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
    int dp[maxn][4];
    memset(dp,0,sizeof(0));
    int s,t,k[4];
    cin>>s>>t>>k[0]>>k[1]>>k[2]>>k[3];
    for(int j=0;j<4;j++)
    {
        dp[1][j]=f[1]%k[j];
        dp[2][j]=f[2]%k[j];
    }
    for(int i=3;i<=10000;i++)
    {
        for(int j=0;j<4;j++)
        {
            dp[i][j]=(dp[i-1][j]+dp[i-2][j])%k[j];
            //cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
        }
    }
    int first=1;
    for(int i=s;i<=t;i++)
    {
        int flag=0;
        for(int j=0;j<4;j++)
        {
            if(dp[i][j]!=0)
                flag++;
        }
        if(flag==4)
        {
            if(first)
            {
                cout<<i;
                first=0;
            }
            else
                cout<<" "<<i;
        }
    }
    cout<<endl;
    return 0;
}

 

 
### C语言蓝桥杯算法题目及其解题思路 #### 1. Fibonacci 数列 Fibonacci 数列是一个经典的递归问题,可以通过简单的迭代方法实现。其核心思想是从第3项开始,每一项等于前两项之和[^1]。 ```c int fib(int n) { if (n <= 1) return n; int a = 0, b = 1, c = 0; for (int i = 2; i <= n; ++i) { c = a + b; a = b; b = c; } return b; } ``` #### 2. 判断闰年 判断某一年是否为闰年的逻辑是基于公历年份能被4整除但不能被100整除,或者能被400整除的规则[^1]。 ```c bool isLeapYear(int year) { return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); } ``` #### 3. 杨辉三角形 杨辉三角形的核心在于利用组合公式计算每行的值。通过动态规划的方式可以有效减少重复计算[^1]。 ```c void yangHuiTriangle(int n) { int triangle[100][100]; for (int i = 0; i < n; ++i) { for (int j = 0; j <= i; ++j) { if (j == 0 || j == i) { triangle[i][j] = 1; } else { triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; } printf("%d ", triangle[i][j]); } printf("\n"); } } ``` #### 4. 字三角形最大路径和 此问题是典型的动态规划应用案例之一。从下往上逐层累加最优子结构的结果,最终得到全局最优解[^2]。 ```c #include <stdio.h> #define MAX(a,b) (((a)>(b))?(a):(b)) int main() { int N; scanf("%d", &N); int tri[N][N], dp[N][N]; for (int i = 0; i < N; ++i) for (int j = 0; j <= i; ++j) scanf("%d", &tri[i][j]); for (int i = 0; i < N; ++i) dp[N-1][i] = tri[N-1][i]; for (int i = N - 2; i >= 0; --i) for (int j = 0; j <= i; ++j) dp[i][j] = tri[i][j] + MAX(dp[i+1][j], dp[i+1][j+1]); printf("%d\n", dp[0][0]); return 0; } ``` --- #### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值