首页 > 其他分享 >题解:P11600 『Fwb』流星の陨落

题解:P11600 『Fwb』流星の陨落

时间:2025-01-22 16:43:41浏览次数:1  
标签:10 le P11600 题解 样例 Fwb 烟花 流星 发射

『Fwb』流星の陨落

题目描述

流星雨来了!

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

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

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

输入格式

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

第二行共 \(n\) 个正整数,代表烟花在数轴上的位置 \(a_i\)(保证 \(a_i\) 递增)。默认最后一个烟花的位置为数轴的尽头,即保证在位置 \(i\)(\(i>a_n\))不会再有流星发射。

输出格式

输出共一行,包含两个正整数,分别表示流星雨中最少的流星数量以及此时的流星间隔。

样例 #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\) 时,流星会发射在 \([1,3,5,7,9]\) 的位置,恰好覆盖所有的烟花。此时发射的流星数量最少为 \(5\)。

【数据范围】

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

  • \(1\le n\le 10^5\)。
  • 对于任意的 \(i\)(\(1\le i\le n\)),都有 \(1\le a_i\le 10^9\)。
测试点 \(n=\) \(a_i\le\) 特殊性质
\(1\) \(1\) \(10\)
\(2\) \(10^5\) \(10^9\) A
\(3,4\) \(10^5\) \(10^9\) B
\(5,6,7\) \(10\) \(10^9\) C
\(8,9,10\) \(10^5\) \(10^9\)

特殊性质 A:保证 \(a_i=a_{i-1}+1\)(\(1<i\le n\))。

特殊性质 B:保证 \(a_i-a_{i-1}=a_{i+1}-a_i\)(\(1<i<n\))。

特殊性质 C:保证至少出现一次 \(a_i-a_{i-1} \le 10^4\)(\(2\le i\le n\))。

题目保证不出现 \(n=1\) 且 \(a_1=1\) 的情况。

前言

比较简单,怎么感觉比 T1 简单(?

思路

求最少需要的流星可以转化为求最大可能的间隔。

发现最优策略是间隔取相邻烟花距离的最大公因数

然后流星数用等差数列项数公式求得,即设首项为 \(x\)(本题为 \(1\)),尾项为 \(y\),公差为 \(d\),项数为 \(\dfrac{y - x}{d} + 1\)。

代码

#include<bits/stdc++.h>
using namespace std;
int last = 1,x;
int main()
{
	int n;
	cin >> n;
	int t = 0;
	for(int i = 1;i <= n;i++)
	{
		cin >> x;
		if(x == last)
		{
			continue;
		}
		if(t == 0)
		{
			t = x - last;
			last = x;
			continue;
		}
		t = __gcd(x - last,t);
		last = x;
	}
	cout << (x - 1) / t + 1 << " " << t;
	return 0;
}

标签:10,le,P11600,题解,样例,Fwb,烟花,流星,发射
From: https://www.cnblogs.com/lichenxi111/p/18686373

相关文章

  • 「CF1437F」Emotional Fishermen 题解
    小水题一道Description有n\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满......
  • 「CF618F」Double Knapsack 题解
    只能说。。。Description给你两个可重集 \(A,B\),\(A,B\) 的元素个数都为 \(n\),它们中每个元素的大小 \(x\in[1,n]\)。请你分别找出 \(A,B\) 的子集,使得它们中的元素之和相等。\(n\leq10^6\)。Solution将找子集强化成找子段(不知道怎么想的),令\(sa_{n}\)表示\(A\)......
  • 「CF1854D」Michael and Hotel 题解
    逆天交互题、、、我只能说阈值分治赛高!!!Description有一个有 \(n\) 个点的内向基环树森林,zlsim位于 \(1\) 号节点,请你通过以下操作求出哪些节点(包括 )可以通过从这两点开始沿边行走若干步汇至一点。给出两个参数 \(u,k\) 和点集 \(S\),询问是否能够通过从 \(u\) 出......
  • P9678 题解
    题意给定一棵\(n\)个点的树\(T\),边有边权。现在有\(q\)组询问,每组询问给出\(l,r\),求出:\[\min_{l\lei<j\ler}\operatorname{dist}(i,j)\]\(n\le2\times10^5\),\(q\le10^6\),\(1\lew\le10^9\)。由于与路径长度有关,所以考虑点分治或者LCA。由于笔......
  • ZJOI2010 基站选址 题解
    ZJOI2010基站选址题解题目链接dp+线段树优化。暴力dp状态设计:自然想到设\(f(i,j)\)表示只考虑前\(i\)个村庄,在前\(i\)个村庄中建\(j\)个基站,并且在第\(i\)个存在建立基站时,最小的费用。转移:转移时,枚举上一个建基站的村庄\(p\)(这同时告诉我们,\(j=1\)......
  • P1048 [NOIP2005 普及组] 采药 题解
    原题链接题目大意:采药,每种药只有一株,每株有它的价值和采它所需的时间,现时间有限,请你输出在有限时间内能获得的价值最大是多少。分析:1.这是一个典型的01背包问题(DP)01背包问题的典型特征:有一个限定容量的背包(对应本题中的时间),有物品(每种只有一个)(对应本题中的药株),物品有......
  • 洛谷P1002 [NOIP2002 普及组] 过河卒 题解
    原题链接题目大意:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:向下或向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。棋盘用坐标表示,AA点(0,0)、BB点(n,m),同样马的位置坐标是需要给出的。现在要求你计算出......
  • 2025牛客寒假算法基础集训营1 ptlks的题解
    A.茕茕孑立之影题意:给定序列,找出一个数x,满足x和数组中任意一个元素都互不为倍数关系思路x范围为1e18以内,序列元素范围为1e9以内,选大于1e9的质数即可,特判序列中有1的情况。代码点击查看代码voidsolve(){ intn; cin>>n; intf=1; for(inti=1;i<=n;i++){ cin>>a[......
  • 题解:洛谷 P4879 ycz的妹子
    题目https://www.luogu.com.cn/problem/P4879感觉还比较简单的线段树。首先我们先建立一棵线段树(范围:)。voidbuild(intk,intl,intr){ tr[k]={l,r}; if(l==r){ Tree[k]=a[l],c[k]=(l<=n); return; } intmid=(l+r)>>1ll; build(k<<1ll,l,mid); build((k<<1ll)|1l......
  • 题解:洛谷 P1351 [NOIP2014 提高组] 联合权值
    题目https://www.luogu.com.cn/problem/P1351我们可以发现,若点对  的距离为 ,则它们一定会经过一个中转点,因此我们考虑枚举中转点 ,然后枚举与  有直接边连接的两个点,按照题意统计答案即可。#include<bits/stdc++.h>usingnamespacestd;#pragmaG++optimisze(3,"Ofas......