tsinsen A1067. Fibonacci数列整除问题 dp

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;
}

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值