Official

C - Geometric Sequence Editorial by mechanicalpenciI


\(A\) が等比数列であることの定義は、、 連続する \(2\) 項の比、すなわち \(\frac{A_{i+1}}{A_i}\) \((1\leq i\leq N-1)\) がすべて等しいことであり、
これは任意の \(1\leq i\leq N-2\) について、

\[ \frac{A_{i+1}}{A_{i}}=\frac{A_{i+2}}{A_{i+1}} \]

が成り立つことと言い換えられます。
しかし、このままでは分数を誤差なく比較する必要があります。
そこで、この式をさらに、

\[ A_{i+1}^2=A_{i}A_{i+2} \]

と変形させることで、整数の比較によって判定を行うことができます。
これは for 文と if 文によって実装することができます。

なお、各項 \(A_i,A_{i+1},A_{i+2}\) はそれぞれ \(10^9\) 以下の正整数であることから両辺は \(10^{18}\) 以下の正整数であり、\(64\) ビット整数型などを用いて比較することができます。
c++ の int など、\(32\) ビット整数型で比較を行うとオーバーフローを起こすため注意してください。

c++ による実装例:

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	long long a[100];
	bool flag=true;

	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<(n-2);i++){
		if((a[i]*a[i+2])!=(a[i+1]*a[i+1]))flag=false;
	}

	if(flag)cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}

Python による実装例:

n=int(input())
a=list(map(int, input().split()))
flag=True

for i in range(n-2):
    if a[i]*a[i+2]!=a[i+1]*a[i+1]:
        flag=False

if flag:
    print("Yes")
else:
    print("No")

posted:
last update: