生死一瞬间。。。QAQ
在debug之后我想到如果都是0怎么办,然后去百度了一下,说全是0的数列不是等比数列。。。,于是我看了好久也看不出来哪里还有错,试了好多数据。。
看了题解,题解是用大数模板,由于如果使用除法,会有小数产生,所以用了a[i]*a[i]=a[i+1]*a[i-1]来做。
我是认为如果比值是小数的话那么一定不是等比数列,因为所有的数都是整数。居然自己写了一个大数除法,倍感骄傲呵呵哒
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
#define maxn 210
int n;
string a[maxn];
int cmp(string x,string y)
{
if(x.length()!=y.length())
return x.length()>y.length()?1:-1;
for(int i=0;i<x.length();i++)
if(x[i]!=y[i])
return x[i]>y[i]?1:-1;
return 0;
}
void getclear(string &x)
{
for(string::iterator t=x.begin();t!=x.end();)
{
if(*t<='9'&&*t>'0') break;
t=x.erase(t);
}
}
string have(string &x,string y)
{
//cout<<"have:"<<x<<" "<<y<<endl;
string ret="";
int num=0;
if(cmp(x,y)==-1) return ret="0";
else if(cmp(x,y)==0)
{
x="";
return ret="1";
}
while(cmp(x,y)!=-1)
{
for(int i=x.length()-1,j=y.length()-1;i>=0||j>=0;i--,j--)
{
if(j<0)
{
if(x[i]<'0') x[i]+=10,x[i-1]-=1;
else break;
continue;
}
if(x[i]>=y[j]) x[i]=(x[i]-y[j])+'0';
else
{
x[i-1]--;
x[i]=(x[i]+10-y[j])+'0';
}
}
num++;
getclear(x);
}
while(num)
{
ret=char(((num%10)+'0'))+ret;
num/=10;
}
getclear(x);
return ret;
}
string cal(string x,string y)
{
string chu="",bei="",ret="";
int tmp=cmp(x,y);
if(tmp==1) bei=x,chu=y;
else if(tmp==-1) bei=y,chu=x;
else
{
ret="1";
return ret;
}
int len=chu.length()-1;
string rem="";
for(int i=0;i<=len;i++) rem+=bei[i];
for(int i=len;i<bei.length();i++)
{
ret+=have(rem,chu);
//cout<<"ret: "<<ret<<" "<<"rem: "<<rem<<endl;
if(i+1>=bei.length()) break;
rem+=bei[i+1];
}
if(rem.length()!=0)
{ret="";}//cout<<"length: "<<rem.length()<<endl;}
//cout<<"finale-ret: "<<ret<<endl;
getclear(ret);
return ret;
}
int solve()
{
int st,en,flag;
int tmp=cmp(a[0],a[1]);
if(tmp==1)
st=0,en=n,flag=1;
else if(tmp==-1)
st=n-1,en=0,flag=-1;
else
{
for(int i=1;i<n;i++)
if(a[i]!=a[i-1]) return 0;
return 1;
}
string s=cal(a[0],a[1]);
//cout<<"the first: "<<s<<endl;
for(int i=st;i<n&&i>=0;i+=flag)
{
if(i+flag>=n||i+flag<0) break;
string ttmp=cal(a[i],a[i+flag]);
//cout<<ttmp<<endl;
if(ttmp==""||ttmp!=s) return 0;
}
return 1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
int flag=0;
for(int i=0;i<n;i++)
{cin>>a[i];getclear(a[i]);if(!a[i].length()) flag++;}
if(flag&&flag!=n) {cout<<"No"<<endl;continue;}
if(n==1||n==2) {cout<<"Yes"<<endl;continue;}
cout<<(solve()?"Yes":"No")<<endl;
}
return 0;
}