D - Matrix Walk

本文探讨了一个算法问题,涉及在一个特定填充规则的矩阵中验证路径的可行性。矩阵大小未知,但每个单元格包含从1到xy的唯一整数。路径由一系列单元格组成,通过检查路径上每一步的移动是否符合矩阵的移动规则来判断其有效性。文章提供了输入输出样例及解析,并附带了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

There is a matrix A of size x × y filled with integers. For every , Ai, j = y(i - 1) + j. Obviously, every integer from [1..xy] occurs exactly once in this matrix.

You have traversed some path in this matrix. Your path can be described as a sequence of visited cells a1, a2, ..., an denoting that you started in the cell containing the number a1, then moved to the cell with the number a2, and so on.

From the cell located in i-th line and j-th column (we denote this cell as (i, j)) you can move into one of the following cells:

  1. (i + 1, j) — only if i < x;
  2. (i, j + 1) — only if j < y;
  3. (i - 1, j) — only if i > 1;
  4. (i, j - 1) — only if j > 1.

Notice that making a move requires you to go to an adjacent cell. It is not allowed to stay in the same cell. You don't know x and y exactly, but you have to find any possible values for these numbers such that you could start in the cell containing the integer a1, then move to the cell containing a2 (in one step), then move to the cell containing a3 (also in one step) and so on. Can you choose x and y so that they don't contradict with your sequence of moves?

Input

The first line contains one integer number n (1 ≤ n ≤ 200000) — the number of cells you visited on your path (if some cell is visited twice, then it's listed twice).

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the integers in the cells on your path.

Output

If all possible values of x and y such that 1 ≤ x, y ≤ 109 contradict with the information about your path, print NO.

Otherwise, print YES in the first line, and in the second line print the values x and y such that your path was possible with such number of lines and columns in the matrix. Remember that they must be positive integers not exceeding 109.

Examples

Input

8
1 2 3 6 9 8 5 2

Output

YES
3 3

Input

6
1 2 1 2 5 3

Output

NO

Input

2
1 10

Output

YES
4 9

Note

The matrix and the path on it in the first test looks like this:

#include<bits/stdc++.h>
using namespace std;
int a[200010];
int main(){
	int n;
	cin>>n;int temp=-1;int tem;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	if(n==1){
		cout<<"YES"<<endl;
		cout<<1000000000<<" "<<1;
		return 0;
	}
	for(int i=1;i<n;i++){
		tem=abs(a[i]-a[i-1]);
		if(a[i]==a[i-1]){
			cout<<"NO";
			return 0;
		}
		else if(abs(a[i]-a[i-1])==1){
			continue;
		}
		else temp=tem;
	}
	if(temp==-1){
		cout<<"YES"<<endl;
		cout<<1000000000<<" "<<1<<endl; 
		return 0;
	}
	for(int i=1;i<n;i++){
		if(abs(a[i]-a[i-1])!=temp&&abs(a[i]-a[i-1])!=1){
			cout<<"NO";
			return 0;
		}
		if(a[i]==a[i-1]+1&&a[i]%temp==1){
			cout<<"NO";
			return 0;
		}
		if(a[i]==a[i-1]-1&&a[i]%temp==0){
			cout<<"NO";
			return 0;
		}
		
	}
	cout<<"YES"<<endl;
	cout<<1000000000<<" "<<temp;
	return 0;
}

Also there exist multiple correct answers for both the first and the third examples.

要注意边界左右是无法相邻的,我潜意识里把所有的方块等化了,还有思路要清晰,不清晰的话,下次代码要重写,不要妄想用原来的代码写,还有没说给出的不会相等,就要考虑是否相等。这种题目应该只能练一下代码能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值