大数判断等比数列,要求公比不能为0, 套用大数模板,判断等比时可以判断a[i]*a[i]与a[i-1]*a[i+1]是否相等。
对于公比为0的判断,如果首项为0,则其余数均为0。首相不为0,则其余数均不为0。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define bug puts("===========");
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define PER(i,n) for(int i=((n)-1);i>=0;i--)
#define PER1(i,n) for(int i=(n);i>0;i--)
#define ALL(A) A.begin(), A.end()
#define T_T for(int _=RD(),test=1;test<=_;test++)
typedef long long ll;
//typedef pair<int,int> pii;
#define CHG ch=getchar()
#define FRD x=bo=0; for(CHG;ch<'0'||ch>'9';CHG) if(ch=='-')bo=1;
#define FR2 for(;ch>='0'&&ch<='9';x=(x<<1)+(x<<3)+ch-'0',CHG);
char ch; int bo;
inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}
inline void RD(int &x){ FRD FR2 if (bo)x=-x; }
inline void RD(ll &x){ FRD FR2 if (bo)x=-x; }
inline ll RD(){ ll x; RD(x); return x; }
inline void RD(char *s){///scanf %s
for (CHG;blank(ch);CHG);
for (;!blank(ch);CHG)*s++=ch; *s=0;
}
inline void RD(char &c){for(CHG;blank(c);CHG);}
template<class T> inline void OT(T x){
static char buf[20];
char *p1=buf;if (!x)*p1++='0';if (x<0)putchar('-'),x=-x;
while(x)*p1++=x%10+'0',x/=10;
while(p1--!=buf)putchar(*p1);
}
inline void pe(){puts("");}//输出回车
inline void pk(){putchar(' ');}//输出空格
const double eps=1e-8;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const ll mod2=1e9+6;
const int maxn=100+10;
const ll llinf=1e18;
/*==================================*/
/*=========================================
大数类:
构造:integer(x) 可以用int, long long, char[]构造
输出:integer.tostring()
运算:
< 大数 < 大数
+ 大数 + 大数,
- 大数 - 大数,
* 大数 * 大数,大数 * long long
/ 大数 / long long (返回一个大数,余数存在全局变量rem里)
/ 大数 / 大数 (返回一个大数,余数存在全局变量d里)
== 大数 = 大数
=========================================*/
const int ra = 10;
int ten[4] = {1, ra, ra * ra, ra*ra * ra};
int radix = ra * ra * ra * ra;
const int NV = 52;
struct integer {
int d[NV];
integer() {
*this = integer(0);
}
integer(int x) {
for (int i = 0; i < NV; i++) d[i] = 0;
if (!x) d[0] = 1;
while(x) {
d[++d[0]] = x % radix;
x /= radix;
}
}
integer(long long x) {
for (int i = 0; i < NV; i++) d[i] = 0;
if (!x) d[0] = 1;
while(x) {
d[++d[0]] = x % radix;
x /= radix;
}
}
integer(const char s[]) {
int len = strlen(s), i, j, k;
d[0] = (len - 1) / 4 + 1;
for (i = 1; i < NV; i++) d[i] = 0;
for (i = len - 1; i >= 0; i--) {
j = (len - i - 1) / 4 + 1;
k = (len - i - 1) % 4;
d[j] += ten[k] * (s[i] - '0');
}
while(d[0] > 1 && d[d[0]] == 0) d[0]--;
}
string tostring() {
string s;
int i, j, temp;
for (i = 3; i >= 1; i--) if (d[d[0]] >= ten[i]) break;
temp = d[d[0]];
for (j = i; j >= 0; j--) {
s += (char) (temp / ten[j] + '0');
temp %= ten[j];
}
for (i = d[0] - 1; i > 0; i--) {
temp = d[i];
for (j = 3; j >= 0; j--) {
s += (char) (temp / ten[j] + '0');
temp %= ten[j];
}
}
return s;
}
void OT(){
int i, j, temp;
for (i = 3; i >= 1; i--) if (d[d[0]] >= ten[i]) break;
temp = d[d[0]];
for (j = i; j >= 0; j--) {
putchar((char) (temp / ten[j] + '0'));
temp %= ten[j];
}
for (i = d[0] - 1; i > 0; i--) {
temp = d[i];
for (j = 3; j >= 0; j--) {
putchar((char) (temp / ten[j] + '0'));
temp %= ten[j];
}
}
}
} d, mid1[15];
bool operator <(const integer &a, const integer &b) {
if (a.d[0] != b.d[0]) return a.d[0] < b.d[0];
for (int i = a.d[0]; i > 0; i--)
if (a.d[i] != b.d[i])
return a.d[i] < b.d[i];
return 0;
}
integer operator +(const integer &a, const integer &b) {
integer c;
c.d[0] = max(a.d[0], b.d[0]);
int i, x = 0;
for (i = 1; i <= c.d[0]; i++) {
x += a.d[i] + b.d[i];
c.d[i] = x % radix;
x /= radix;
}
while(x) {
c.d[++c.d[0]] = x % radix;
x /= radix;
}
return c;
}
integer operator -(const integer &a, const integer &b) {
integer c;
c.d[0] = a.d[0];
int i, x = 0;
for (i = 1; i <= c.d[0]; i++) {
x += radix + a.d[i] - b.d[i];
c.d[i] = x % radix;
x = x / radix - 1;
}
while(c.d[0] > 1 && c.d[c.d[0]] == 0) c.d[0]--;
return c;
}
integer operator *(const integer &a, const integer &b) {
integer c;
c.d[0] = a.d[0] + b.d[0];
int i, j, x = 0;
for (i = 1; i <= a.d[0]; i++) {
x = 0;
for (j = 1; j <= b.d[0]; j++) {
x = a.d[i] * b.d[j] + x + c.d[i + j - 1];
c.d[i + j - 1] = x % radix;
x /= radix;
}
c.d[i + b.d[0]] = x;
}
while(c.d[0] > 1 && c.d[c.d[0]] == 0) c.d[0]--;
return c;
}
integer operator *(const integer &a, const long long &k) {
integer c;
c.d[0] = a.d[0];
int i;
long long x = 0;
for (i = 1; i <= a.d[0]; i++) {
x += a.d[i] * k;
c.d[i] = x % radix;
x /= radix;
}
while(x > 0) {
c.d[++c.d[0]] = x % radix;
x /= radix;
}
while(c.d[0] > 1 && c.d[c.d[0]] == 0) c.d[0]--;
return c;
}
long long rem;
integer operator /(const integer &a, const long long &k) {
integer c;
c.d[0] = a.d[0];
long long x = 0;
for (int i = a.d[0]; i >= 1; i--) {
x += a.d[i];
c.d[i] = x / k;
x %= k;
rem = x;
x *= radix;
}
while(c.d[0] > 1 && c.d[c.d[0]] == 0) c.d[0]--;
return c;
}
bool smaller(const integer &a, const integer &b, int delta) {
if (a.d[0] + delta != b.d[0]) return a.d[0] + delta < b.d[0];
for (int i = a.d[0]; i > 0; i--)
if (a.d[i] != b.d[i + delta])
return a.d[i] < b.d[i + delta];
return 1;
}
void Minus(integer &a, const integer &b, int delta) {
int i, x = 0;
for (i = 1; i <= a.d[0] - delta; i++) {
x += radix + a.d[i + delta] - b.d[i];
a.d[i + delta] = x % radix;
x = x / radix - 1;
}
while(a.d[0] > 1 && a.d[a.d[0]] == 0) a.d[0]--;
}
integer operator /(const integer &a, const integer &b) {
integer c;
d = a;
int i, j, temp;
mid1[0] = b;
for (i = 1; i <= 13; i++) mid1[i] = mid1[i - 1] * 2;
for (i = a.d[0] - b.d[0]; i >= 0; i--) {
temp = 8192;
for (j = 13; j >= 0; j--) {
if (smaller(mid1[j], d, i)) {
Minus(d, mid1[j], i);
c.d[i + 1] += temp;
}
temp /= 2;
}
}
c.d[0] = max(1, a.d[0] - b.d[0] + 1);
while(c.d[0] > 1 && c.d[c.d[0]] == 0) c.d[0]--;
return c;
}
bool operator ==(const integer &a, const integer &b) {
if (a.d[0] != b.d[0]) return 0;
for (int i = 1; i <= a.d[0]; i++)
if (a.d[i] != b.d[i])
return 0;
return 1;
}
bool operator !=(const integer &a,const integer &b){
return !(a==b);
}
bool iszero(const integer &a){
return a.d[0]==1&&a.d[1]==0;
}
void init(int b) { ///将大数切换至任意<=10进制
for (int i = 1; i <= 3; i++)
ten[i] = ten[i - 1] * b;
radix = b * b * b * b;
}
integer a[103];
char rd[maxn];
int main()
{
T_T{
int n=RD();
REP(i,n){
RD(rd);
a[i]=integer(rd);
}
int flag=1;
for(int i=1;i<n-1;i++){
if(a[i-1]*a[i+1]!=a[i]*a[i]) {
flag=0;
break;
}
}
if(!iszero(a[0])){
for(int i=0;i<n;i++)if(iszero(a[i])){
flag=0; break;
}
}else if(n>=2){
for(int i=0;i<n;i++)if(!iszero(a[i])){
flag=0; break;
}
}
if(flag) puts("Yes");
else puts("No");
}
return 0;
}