济南学习 Day 5 T2 晚
等比数列(sequence)
【题目描述】
判断一个数列是否为等比数列。
等比数列的定义为能被表示成a,aq,aq^2,aq^3...的数列,其中a和q不等于0。
【输入说明】
输入文件的第一行有一个正整数T,表示数据组数。
接下去有T组数据,每组数据的第一行一个整数n,接下来第二行n个数非负整数Ai,表示数列。
【输出说明】
对于每一个组的每个数据输出单独一行Yes或者No。
【样例输入】
2
3
1 1 1
3
1 4 2
【样例输出】
Yes
No
【数据范围】
对于40%的数据 0<=Ai<=10^9
对于100%的数据 T<=5,n<=1000,0<=Ai<=10^100
1 /*利用等比中项+高精乘法判断*/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #define N 1010 6 #define M 310 7 using namespace std; 8 int T,n; 9 int t[M],r[M]; 10 int a[N][M]; 11 char s[M]; 12 int init() 13 { 14 int x=0,f=1;char c=getchar(); 15 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 16 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 17 return x*f; 18 } 19 void mul(int c[M],int a[M],int b[M]) 20 { 21 int l1=a[0],l2=b[0]; 22 for(int i=1;i<=l1;i++) 23 { 24 int x=0; 25 for(int j=1;j<=l2;j++) 26 { 27 c[i+j-1]+=a[i]*b[j]+x; 28 x=c[i+j-1]/10; 29 c[i+j-1]%=10; 30 } 31 c[i+l2]+=x; 32 } 33 c[0]=l1+l2; 34 while(c[0]>1&&c[c[0]]==0)c[0]--; 35 } 36 int judge(int a[M],int b[M]) 37 { 38 int l1=a[0],l2=b[0]; 39 if(l1!=l2)return 0; 40 for(int i=1;i<=l1;i++) 41 if(a[i]!=b[i])return 0; 42 return 1; 43 } 44 int main() 45 { 46 freopen("sequence.in","r",stdin); 47 freopen("sequence.out","w",stdout); 48 T=init(); 49 while(T--) 50 { 51 n=init(); 52 memset(a,0,sizeof(a)); 53 for(int i=1;i<=n;i++) 54 { 55 scanf("%s",s); 56 int l=strlen(s);a[i][0]=l; 57 for(int j=1;j<=l;j++) 58 a[i][j]=s[l-j]-'0'; 59 } 60 if(a[1][0]==1&&a[1][1]==0)// 第一项且为0 61 { 62 printf("No\n"); 63 continue; 64 } 65 if(n==1)// 只有一个数 66 { 67 printf("Yes\n"); 68 continue; 69 } 70 if(a[2][0]==1&&a[2][1]==0) // 第二项为0 71 { 72 printf("No\n"); 73 continue; 74 } 75 if(n==2)// 只有两个数 76 { 77 printf("Yes\n"); 78 continue; 79 } 80 int flag=0; 81 for(int i=3;i<=n;i++) 82 { 83 memset(t,0,sizeof(t)); 84 mul(t,a[i-2],a[i]); 85 memset(r,0,sizeof(r)); 86 mul(r,a[i-1],a[i-1]); 87 if(judge(t,r))continue; 88 flag=1;break; 89 } 90 if(flag) 91 { 92 printf("No\n"); 93 continue; 94 } 95 printf("Yes\n"); 96 } 97 fclose(stdin);fclose(stdout); 98 return 0; 99 }