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;
}
 
原文地址:https://www.cnblogs.com/qscqesze/p/4294574.html