【bzoj 1424】Appear

17 篇文章 0 订阅

Appear

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 6 Solved: 4
[Submit][Status][Discuss]
Description

给出一个数列C1,C2…Cn,求一个最小的Q,使得存在一个P(P小于Q),满足p小数形式连续的包含这
一段c1…cn
Input

第一行一个数N,接下来N行,每行一个数,表示Ci

Output

输出一共2行,第一行表示P,第二行表示Q

Sample Input

1

1

Sample Output

1

6

HINT

N<=100 P,Q不超过60位,建议使用高精度
随机到的题,难到爆炸,其实推论没什么难的,主要难在写程序
10

// 标程
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 40
#define mod 100000000
using namespace std;
typedef long long LL;
struct bign
{
    int n,digit[maxn];
    bign()
    {
        n=1;
    }
    friend bign operator + (bign a,bign b)
    {
        static bign c;
        memset(c.digit,0,sizeof(c.digit));
        c.n=max(a.n,b.n);
        int jinwei=0;
        for(int i=1;i<=c.n;++i)
        {
            c[i]=a[i]+b[i]+jinwei;
            jinwei=c[i]/mod;
            c[i]%=mod;
        }
        if(jinwei)
            c[++c.n]=jinwei;
        return c;
    }
    friend bign operator * (bign a,bign b)
    {
        static bign c;
        memset(c.digit,0,sizeof(c.digit));
        for(int i=1;i<=a.n;++i)
        {
            int jinwei=0;
            for(int j=1;j<=b.n;++j)
            {
                LL x=c[i+j-1]+(LL)a[i]*b[j]+jinwei;
                jinwei=x/mod;
                c[i+j-1]=x%mod;
            }
            if(jinwei)
                c[i+b.n]=jinwei;
        }
        for(c.n=a.n+b.n;c.n&&c[c.n]==0;--c.n);
        return c;
    }
    friend bign operator * (bign a,int p)
    {
        static bign b;
        b.n=a.n;
        int jinwei=0;
        memset(b.digit,0,sizeof(b.digit));
        for(int i=1;i<=b.n;++i)
        {
            b[i]=a[i]*p+jinwei;
            jinwei=b[i]/mod;
            b[i]%=mod;
        }
        if(jinwei)
            b[++b.n]=jinwei;
        return b;
    }
    friend bool operator < (const bign &a,const bign &b)
    {
        if(a.n!=b.n)
            return a.n<b.n;
        for(int i=a.n;i>=1;--i)
            if(a[i]!=b[i])
                return a[i]<b[i];
        return false;
    }
    friend bool operator <= (const bign &a,const bign &b)
    {
        if(a.n!=b.n)
            return a.n<b.n;
        for(int i=a.n;i>=1;--i)
            if(a[i]!=b[i])
                return a[i]<b[i];
        return true;
    }
    int operator [] (int p) const
    {
        return digit[p];
    }
    int& operator [] (int p)
    {
        return digit[p];
    }
    void print()
    {
        printf("%d",digit[n]);
        for(int i=n-1;i>=1;--i)
            printf("%08d",digit[i]);
        printf("\n");
    }
}C1,C2,a,b,c,d,Power;
void read()
{
    int n;
    scanf("%d",&n);
    Power[1]=1;
    for(int i=1,x;i<=n;++i)
    {
        scanf("%d",&x);
        Power=Power*10;
        C1=C1*10,C1[1]+=x;
    }
    C1=C1*10,Power=Power*10;
    b[1]=9,C2=C1+b;
    b[1]=1,c[1]=1;
}
void work()
{
    bign e,f,val;
    while(1)
    {
        e=a+c,f=b+d,val=e*Power;
        if(val<C1*f)
            a=e,b=f;
        else if(C2*f<=val)
            c=e,d=f;
        else
            break;
    }
    e.print(),f.print();
}
int main()
{
    read();
    work();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值