济南学习 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
");
63             continue;
64         }
65         if(n==1)//  只有一个数 
66         {
67             printf("Yes
");
68             continue;
69         }
70         if(a[2][0]==1&&a[2][1]==0) // 第二项为0 
71         {
72             printf("No
");
73             continue;
74         }
75         if(n==2)// 只有两个数 
76         {
77             printf("Yes
");
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
");
93             continue;
94         }
95         printf("Yes
");
96     }
97     fclose(stdin);fclose(stdout);
98     return 0;
99 }
原文地址:https://www.cnblogs.com/suishiguang/p/6043778.html