打卡信奥刷题(901)用C++信奥P11600[普及组/提高] 『Fwb』流星の陨落
P11600 『Fwb』流星の陨落
题目描述
流星雨来了!
当然,这场流星雨确确实实是 Fwb 设计的。Fwb 在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。
由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我们把地面上烟花的摆放看作一个数轴,若流星间隔是 kkk,那么在 iii 位置发射一颗流星后,下一个发射流星的位置必须是 i+ki+ki+k。特殊的,第一个发射流星的位置必须是 111。
为了使流星雨好看,保证每一个烟花都会和流星碰撞,即每一个烟花的位置都会有流星发射。但不保证每一个流星都有可碰撞的烟花。为了尽可能减少资源消耗,发射的流星应在满足条件的前提下最少,现在想请你算出,发射的流星雨中最少有多少颗流星以及此时的流星间隔是多少。
输入格式
输入的第一行包含一个正整数 nnn,代表地上共放置了 nnn 个烟花。
第二行共 nnn 个正整数,代表烟花在数轴上的位置 aia_iai(保证 aia_iai 递增)。默认最后一个烟花的位置为数轴的尽头,即保证在位置 iii(i>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^51≤n≤105。
- 对于任意的 iii(1≤i≤n1\le i\le n1≤i≤n),都有 1≤ai≤1091\le a_i\le 10^91≤ai≤109。
| 测试点 | n=n=n= | ai≤a_i\leai≤ | 特殊性质 |
|---|---|---|---|
| 111 | 111 | 101010 | 无 |
| 222 | 10510^5105 | 10910^9109 | A |
| 3,43,43,4 | 10510^5105 | 10910^9109 | B |
| 5,6,75,6,75,6,7 | 101010 | 10910^9109 | C |
| 8,9,108,9,108,9,10 | 10510^5105 | 10910^9109 | 无 |
特殊性质 A:保证 ai=ai−1+1a_i=a_{i-1}+1ai=ai−1+1(1<i≤n1<i\le n1<i≤n)。
特殊性质 B:保证 ai−ai−1=ai+1−aia_i-a_{i-1}=a_{i+1}-a_iai−ai−1=ai+1−ai(1<i<n1<i<n1<i<n)。
特殊性质 C:保证至少出现一次 ai−ai−1≤104a_i-a_{i-1} \le 10^4ai−ai−1≤104(2≤i≤n2\le i\le n2≤i≤n)。
题目保证不出现 n=1n=1n=1 且 a1=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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)