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;
}