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[]=;
f[]=;
for(int i=;i<=;i++)
{
f[i]=f[i-]+f[i-];
}
int dp[maxn][];
memset(dp,,sizeof());
int s,t,k[];
cin>>s>>t>>k[]>>k[]>>k[]>>k[];
for(int j=;j<;j++)
{
dp[][j]=f[]%k[j];
dp[][j]=f[]%k[j];
}
for(int i=;i<=;i++)
{
for(int j=;j<;j++)
{
dp[i][j]=(dp[i-][j]+dp[i-][j])%k[j];
//cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
}
}
int first=;
for(int i=s;i<=t;i++)
{
int flag=;
for(int j=;j<;j++)
{
if(dp[i][j]!=)
flag++;
}
if(flag==)
{
if(first)
{
cout<<i;
first=;
}
else
cout<<" "<<i;
}
}
cout<<endl;
return ;
}
 
05-02 15:16