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;

}

 

 

你可能感兴趣的:(fibonacci)