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,意义如题目描述。
第二行四个数,a,b,c,d,意义如题目描述。
输出格式
一行若干个数,A1,A2,A3...An,从小到大排列,表示第Ai个Fibonacci数既不是a也不是b也不是c也不是d的倍数。
每两个数之间用空格隔开。
每两个数之间用空格隔开。
样例输入
1 5
2 3 5 7
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]
转移方程 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; }