斐波那契数列取模:
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
样例输入:
4
5
2
19
1
样例输出:
5
1
4181
1
问题分析
斐波那契数列的规律为f[i] = f[i-1] + f[i-2], 并且根据第一项与第二项都为1, 递推出之后的数值, 接下来我们使用递推的方式来实现功能, 容易忘记的是每次求第n个的值时, 需要对临时变量进行重置.
代码如下:
#include <iostream>
using namespace std;
int main(){
int n, a, t1 = 1, t2 = 1, temp = 1; // a获取数据, t1代表第一个数, t2代表第二个数, temp交换值临时变量
cin >> n;
int s[n]; // s数组存储最终的结果
for( int i = 0; i < n; i++ ){
cin >> a;
t1 = 1; // 这里的初始化是必须的, 因为每次都是从第一个开始计算数列
t2 = 1;
temp = 1;
for( int j = 0; j < a-2; j++ ){ // 计算公式
temp = t1;
t1 = t2;
t2 = t1 + temp;
}
s[i] = t2 % 10000; // 对t2进行取余
}
for( int i = 0; i < n; i++ ){ // 输出
cout << s[i] << endl;
}
return 0;
}
课程冲突:
小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。
定义两门课程的冲突程度为: 有几天是这两门课程都要上的。
例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。
现在你需要求的是这 n 门课中冲突程度最大的两门课的冲突程度。
输入
第一行一个正整数 n 表示课程数量。 接下来 n 行,每行两个正整数 ai,bi。 2 ≤ n≤ 1000, 1 ≤ ai ≤ bi ≤ 1000。
输出
输出一个整数表示最大的冲突程度
样例输入:
3
1 3
2 4
5 5
样例输出:
2
问题分析
对于例子所说的一门课天数的区间为[1, 3], 另一门课区间为[2, 4], 得出来的2是求解区间的并集, 即相交的区间, 如下图:
那么我们可以得知对于区间[a1, b1]与区间[a2, b2], 有两种情况.
第一种情况是a1点落在区间[a2, b2]中, 如下:
这时需要满足的条件为a2 <= a1 <= b2, 那么区间的差值(即冲突天数)计算方式为: b2 - a1 + 1
第二种情况是b1点落在区间[a2, b2]中, 如下:
这时需要满足的条件为a2 <= b1 <= b2, 那么区间的差值(即冲突天数)计算方式为: b1 - a2 + 1
总结出来的公式为:
当a2<=a1<=b2时
当a2<=b1<=b2时
代码如下:
#include <iostream>
using namespace std;
int main(){
// 数据的初始化
int n;
cin >> n;
int a[n], b[n]; // a数组存储左区间, b数组存储右区间
for( int i = 0; i < n; i++ ){
cin >> a[i] >> b[i];
}
int max_day = 0; // 存储最大天数
// 进行搜索(枚举)
for( int i = 0; i < n; i++ ){ // 拿出一天, 与后续的天数进行相比
for( int j = i + 1; j < n; j++ ){ // 开始位置为i后续的天数
if( a[j] <= a[i] && a[i] <= b[j] ){ // 当a[i](左区间)落在区间[a[j], b[j]]里面
max_day = max(max_day, b[j]-a[i]+1);
}
else if( a[j] <= b[i] && b[i] <= b[j] ){ // 当b[i](右区间)落在区间[a[j], b[j]]里面
max_day = max(max_day, b[i]-a[j]+1);
}
}
}
cout << max_day;
return 0;
}
余数相同:
已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。
请问满足上述条件的x的最小值是多少?数据保证x有解。
输入
一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。
输出
一个整数,即满足条件的x的最小值。
输入样例
300 262 205
输出样例
19
问题分析
使用暴力枚举即可.
代码如下:
#include <iostream>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
for( int i = 2; i < 10000000; i++ ){ // 从2开始
if( a % i == b % i && a % i == c % i ){
cout << i;
break; // 遇到最小的跳出循环
}
}
return 0;
}