比赛 东方幻想乡 S1 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 西行寺幽幽子 最终得分 100
用户昵称 Makazeu 运行时间 0.176 s
代码语言 C++ 内存使用 1.00 MiB
提交时间 2012-08-07 20:11:01
显示代码纯文本
/*
*Problem : spring
*Author    : Yee-fan Zhu
*Solution  : 高精度除法、二分答案
*/
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
string str; int len;
class hugeint 
{
public:
    int len,num[20011];
    void clear()
    {
        len=0;
        memset(num,0,sizeof(num));
    }
}bei,chu,L,R,Mid,ans,tmp,ni;
hugeint MAXN;
 
inline void readl(hugeint&hgint)
{
    str.clear();
    cin>>str;
    hgint.len=str.length();
    for(int i=1;i<=hgint.len;i++)
        hgint.num[i]=str[hgint.len-i]-'0';
}
 
inline void print(hugeint&hgint)
{
    for(int i=hgint.len;i>=1;i--)
        printf("%d",hgint.num[i]);
    printf("\n");
}
 
bool hgover(hugeint a,hugeint b)   //高精度判大小
{
    if(a.len!=b.len) return a.len>b.len;
    for(int i=a.len;i>=1;i--)
        if(a.num[i]!=b.num[i])
            return a.num[i]>b.num[i];
    return false;   
}
 
inline void init()
{
    readl(bei); readl(chu);
    //print(bei); print(chu);
    L.len=1;L.num[1]=1;
    R=bei; MAXN.len=10;
    MAXN.num[10]=2;
    ni.len=1; ni.num[1]=2;
    if(hgover(R,MAXN)) R=MAXN;
    //print(L); print(R);
}
 
inline hugeint add(hugeint a,hugeint b) //高精度加法
{
    hugeint res; res.clear();
    if(a.len>b.len) res.len=a.len;
    else res.len=b.len;
    for(int i=1;i<=res.len;i++)
    {
        res.num[i]+=(a.num[i]+b.num[i]);
        res.num[i+1]+=res.num[i]/10;
        res.num[i]%=10;
    }
    if(res.num[res.len+1]>0) 
        res.len++;
    return res;
}
 
inline hugeint average(hugeint a,hugeint b) //求平均数
{
    hugeint res;
    res=add(a,b);
    for(int i=res.len;i>=2;i--)
    {
        res.num[i-1]+=(res.num[i]%2)*10;
        res.num[i]/=2;
    }
    res.num[1]/=2;
    if(res.num[res.len]==0)
        res.len--;
    return res;
}
 
inline hugeint times(hugeint a,hugeint b) //高精度乘法
{
    hugeint res; res.clear();
    for(int i=1;i<=a.len;i++)
        for(int j=1;j<=b.len;j++)
            res.num[i+j-1]+=a.num[i]*b.num[j];
    for(int i=1;i<=a.len+b.len;i++)  
    {
        res.num[i+1]+=res.num[i]/10;
        res.num[i]%=10;
    }
    if(res.num[a.len+b.len]>0) 
        res.len=a.len+b.len;
    else res.len=a.len+b.len-1;
    return res;
}
 
inline void binarychop()
{
    hugeint res;
    do
    {
        Mid=average(L,R);
        res=times(Mid,chu);
        if(hgover(res,bei)) R=Mid;
        else L=Mid;
    }while(!hgover(add(L,ni),R));
    print(L);
}
 
int main()
{
    freopen("spring.in","r",stdin);
    freopen("spring.out","w",stdout);
    init();
    binarychop();
    return 0;
}