题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5429
解题思路:
官方题解:
判断是否为等比数列,可以检验对所有1<i<nA[i−1]∗A[i+1]=A[i]∗A[i] 是否都成立。
直接高精度也是资词的。
比较简单的方法是选择若干质数(保证乘积大于10200),在模意义下检验。复杂度O(k∗n)。k表示选取的质数个数。
算法思想:正如题解所解释的,只要判断(0,n-1)之间的数,是否符合A[i−1]∗A[i+1]=A[i]∗A[i] 就行了,然后特判等于0的情况就可以了。不过,比赛时候真的很挫,以前写C/C++的时候while里面经常用T--,但是用java里面不能这么写,于是乎,把这句写在了最后面,然而中间有特判,使用了continue;于是乎,赛后仍然wrong了十几次,才发现,原来是这里错了。。。泪奔。。。
AC代码:
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sca = new Scanner (System.in);
BigDecimal a[] = new BigDecimal[110];
BigDecimal ZERO = BigDecimal.ZERO;
int T = sca.nextInt(),t = 1;
while(t <= T){
t++;
int n = sca.nextInt();
int sum = 0;
for(int i = 0; i < n; i++){
a[i] = sca.nextBigDecimal();
if(a[i].equals(ZERO))
sum++;
}
if(n == 1){
System.out.println("Yes");
continue;
}
if(sum != 0){
if(sum == n)
System.out.println("Yes");
else
System.out.println("No");
continue;
}
int flag3 = 1;
for(int i = 1; i < n-1; i++){
if(!(a[i].multiply(a[i])).equals(a[i-1].multiply(a[i+1]))){
flag3 = 0;
break;
}
}
if(flag3 == 1)
System.out.println("Yes");
else
System.out.println("No");
}
}
}