P11600 『Fwb』流星の陨落

题目描述

流星雨来了!

当然,这场流星雨确确实实是 Fwb 设计的。Fwb 在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。

由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我们把地面上烟花的摆放看作一个数轴,若流星间隔是 kkk,那么在 iii 位置发射一颗流星后,下一个发射流星的位置必须是 i+ki+ki+k。特殊的,第一个发射流星的位置必须是 111

为了使流星雨好看,保证每一个烟花都会和流星碰撞,即每一个烟花的位置都会有流星发射。但不保证每一个流星都有可碰撞的烟花。为了尽可能减少资源消耗,发射的流星应在满足条件的前提下最少,现在想请你算出,发射的流星雨中最少有多少颗流星以及此时的流星间隔是多少。

输入格式

输入的第一行包含一个正整数 nnn,代表地上共放置了 nnn 个烟花。

第二行共 nnn 个正整数,代表烟花在数轴上的位置 aia_iai(保证 aia_iai 递增)。默认最后一个烟花的位置为数轴的尽头,即保证在位置 iiii>ani>a_ni>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 解释】

当流星间隔为 222 时,流星会发射在 [1,3,5,7,9][1,3,5,7,9][1,3,5,7,9] 的位置,恰好覆盖所有的烟花。此时发射的流星数量最少为 555

【数据范围】

对于所有的测试数据,保证:

  • 1≤n≤1051\le n\le 10^51n105
  • 对于任意的 iii1≤i≤n1\le i\le n1in),都有 1≤ai≤1091\le a_i\le 10^91ai109
测试点n=n=n=ai≤a_i\leai特殊性质
111111101010
22210510^510510910^9109A
3,43,43,410510^510510910^9109B
5,6,75,6,75,6,710101010910^9109C
8,9,108,9,108,9,1010510^510510910^9109

特殊性质 A:保证 ai=ai−1+1a_i=a_{i-1}+1ai=ai1+11<i≤n1<i\le n1<in)。

特殊性质 B:保证 ai−ai−1=ai+1−aia_i-a_{i-1}=a_{i+1}-a_iaiai1=ai+1ai1<i<n1<i<n1<i<n)。

特殊性质 C:保证至少出现一次 ai−ai−1≤104a_i-a_{i-1} \le 10^4aiai11042≤i≤n2\le i\le n2in)。

题目保证不出现 n=1n=1n=1a1=1a_1=1a1=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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐