HDU 5433/BC 54C Geometric Progression

1 篇文章 0 订阅

大数判断等比数列,要求公比不能为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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值