打卡信奥刷题(901)用C++信奥P11600[普及组/提高] 『Fwb』流星の陨落
流星雨来了!当然,这场流星雨确确实实是 Fwb 设计的。Fwb 在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我们把地面上烟花的摆放看作一个数轴,若流星间隔是k,那么在i位置发射一颗流星后,下一个发射流星的位置必须是ik。特殊的,第一个发射流星的位置1。为了使流
P11600 『Fwb』流星の陨落
题目描述
流星雨来了!
当然,这场流星雨确确实实是 Fwb 设计的。Fwb 在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。
由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我们把地面上烟花的摆放看作一个数轴,若流星间隔是 k k k,那么在 i i i 位置发射一颗流星后,下一个发射流星的位置必须是 i + k i+k i+k。特殊的,第一个发射流星的位置必须是 1 1 1。
为了使流星雨好看,保证每一个烟花都会和流星碰撞,即每一个烟花的位置都会有流星发射。但不保证每一个流星都有可碰撞的烟花。为了尽可能减少资源消耗,发射的流星应在满足条件的前提下最少,现在想请你算出,发射的流星雨中最少有多少颗流星以及此时的流星间隔是多少。
输入格式
输入的第一行包含一个正整数 n n n,代表地上共放置了 n n n 个烟花。
第二行共 n n n 个正整数,代表烟花在数轴上的位置 a i a_i ai(保证 a i a_i ai 递增)。默认最后一个烟花的位置为数轴的尽头,即保证在位置 i i i( i > a n i>a_n i>an)不会再有流星发射。
输出格式
输出共一行,包含两个正整数,分别表示流星雨中最少的流星数量以及此时的流星间隔。
输入输出样例 #1
输入 #1
5
1 3 5 7 9
输出 #1
5 2
输入输出样例 #2
输入 #2
7
10 13 19 301 304 307 3004
输出 #2
1002 3
输入输出样例 #3
输入 #3
3
2 1000000 1234567
输出 #3
1234567 1
说明/提示
【样例 1 解释】
当流星间隔为 2 2 2 时,流星会发射在 [ 1 , 3 , 5 , 7 , 9 ] [1,3,5,7,9] [1,3,5,7,9] 的位置,恰好覆盖所有的烟花。此时发射的流星数量最少为 5 5 5。
【数据范围】
对于所有的测试数据,保证:
- 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105。
- 对于任意的 i i i( 1 ≤ i ≤ n 1\le i\le n 1≤i≤n),都有 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1≤ai≤109。
测试点 | n = n= n= | a i ≤ a_i\le ai≤ | 特殊性质 |
---|---|---|---|
1 1 1 | 1 1 1 | 10 10 10 | 无 |
2 2 2 | 1 0 5 10^5 105 | 1 0 9 10^9 109 | A |
3 , 4 3,4 3,4 | 1 0 5 10^5 105 | 1 0 9 10^9 109 | B |
5 , 6 , 7 5,6,7 5,6,7 | 10 10 10 | 1 0 9 10^9 109 | C |
8 , 9 , 10 8,9,10 8,9,10 | 1 0 5 10^5 105 | 1 0 9 10^9 109 | 无 |
特殊性质 A:保证 a i = a i − 1 + 1 a_i=a_{i-1}+1 ai=ai−1+1( 1 < i ≤ n 1<i\le n 1<i≤n)。
特殊性质 B:保证 a i − a i − 1 = a i + 1 − a i a_i-a_{i-1}=a_{i+1}-a_i ai−ai−1=ai+1−ai( 1 < i < n 1<i<n 1<i<n)。
特殊性质 C:保证至少出现一次 a i − a i − 1 ≤ 1 0 4 a_i-a_{i-1} \le 10^4 ai−ai−1≤104( 2 ≤ i ≤ n 2\le i\le n 2≤i≤n)。
题目保证不出现 n = 1 n=1 n=1 且 a 1 = 1 a_1=1 a1=1 的情况。
C++实现
#include <bits/stdc++.h>
using namespace std;
int n, m, mx;
int main()
{
cin >> n >> m;
mx = --m;
for(int i = 2, x; i <= n; i++)
{
scanf(“%d”, &x);
m = __gcd(m, (x - 1));
mx = max(mx, (x - 1));
}
cout << mx / m + 1 << " " << m;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)