noip模拟赛 西行寺幽幽子 高精度除法

西行寺幽幽子

时间限制: 1 Sec  内存限制:128 MB

题目描述

在幻想乡,西行寺幽幽子是以贪吃闻名的亡灵。不过幽幽子可不是只会吃,至少她还管理着亡灵界。话说在幽幽子居住的白玉楼有一颗常年不开花的樱树——西行妖。幽幽子决定去收集人间的春度,聚集起来让西行妖开花。很快,作为幽幽子家园艺师的魂魄妖梦收集到了M个单位的春度。并且在这段时间里,幽幽子计算出要让西行妖开出一朵花需要N个单位的春度。现在幽幽子想要知道,使用所有的春度,能够让西行妖开出多少朵花。

输入

第1行:一个正整数M

第2行:一个正整数N

N,M的位数不超过L,L的范围在题目后面给出

输出

第1行:一个整数ans,表示能开出花的朵数

样例输入

73861758
12471

样例输出

5922

提示

对于60%的数据:L <= 2,000且ans <= 2,000


对于100%的数据:L <= 20,000且ans <= 2,000,000,000



高精度除法,ans的数据范围有优势 ,用二分



#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
int lm,ln,lt,ans;
ll m[50005],n[50005];
ll t[50005];char ch[50005];
bool judge(ll x)
{
	memset(t,0,sizeof(t));
	for(int i=1;i<=ln;i++)
	t[i]=n[i]*x;
	lt=ln;
	for(int i=1;i<=lt;i++)
	{
		if(t[i]>=10)lt=max(lt,i+1);
		t[i+1]+=t[i]/10;
		t[i]%=10;
	}
	//cout<<lm<<" "<<lt<<endl;
	if(lt>lm)return 0;
	else if(lt<lm)return 1;
	else 
	{
		for(int i=lt;i;i--)
		if(t[i]>m[i])return 0;
		else if(t[i]<m[i])return 1;
		return 1;
	}
}
int main()
{
	scanf("%s",ch+1);
	lm=strlen(ch+1);
	for(int i=1;i<=lm;i++)
	m[i]=ch[lm-i+1]-'0';
	scanf("%s",ch+1);
	ln=strlen(ch+1);
	for(int i=1;i<=ln;i++)
	n[i]=ch[ln-i+1]-'0';
	ll l=0,r=2000000000;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		if(judge(mid))ans=mid,l=mid+1;
		else r=mid-1;
	//	cout<<mid<<endl;
	}
	printf("%d",ans);
	return 0;
}








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值