比赛 |
东方幻想乡 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;
}