欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

22.01.13二分练习题

时间:2023-06-01

说实话 做二分得需要点脑子(doge)

(1)找到最小的N,使得N!末尾恰好有Q个0

相信你已经熟练掌握N!末尾的0的个数的求法。
现在给出数字Q,请找到最小的N,使得N!末尾恰好有Q个0

输入格式

输入一个整数Q(1<=Q<=10^8)

输出格式

如果无解,输出"No solution",否则输出 N 。

输入样例

2

输出样例

10

虽然说是二分标签

但是着实没看出来哪里二分

暴力枚举每一种情况下末尾0个数

匹配就输出

超过输出No solution

#include#include #include#include#include#include#includeusing namespace std;typedef unsigned long long ull;//const ull MOD=0x3f3f3f3f3f;const ull MOD=998244353;const double PI=3.1415926;ull dp[1000010];ull jie[1000010];//string a,b;int main(){ ull x,y; cin>>x; int i,j,k; //int f=1; for(i=5;;i++) { int t=i; int sum=0; while(t) { sum+=t/5; t/=5; } //cout<x) { cout<<"No solution"<

不算很快,但是也没超时

(2)

没做出来,看的解析

Hi是一个单增函数

这道题浮点型一看就没法正常暴力枚举,就没法试了

我裂开了无数次

#include#include #include#include#include#include#includeusing namespace std;typedef unsigned long long ull;const ull MAX=0x3f3f3f3f3f;const double PI=3.1415926;double answer[1000010];ull jie[1000010];//string a,b;double t;double x,y;int n,b;int i,j,k;bool ans(double x){ answer[1]=x; //int i;//之前定义在了循环内 出循环i失效 for( i=2; i>n>>x) { answer[0]=x; double life=-1,love=1e8; //int time=10000; while(love-life>1e-8) { double mid=(life+love)/2; //这里不会溢出 if(ans(mid)) { love=mid; //可以继续降低区间 } else { life=mid; //不可以 则提高区间 } } cout<

 参考的代码

真简洁,不用调用函数逻辑就是清晰

#include#include #include#include#include#include#includeusing namespace std;typedef unsigned long long ull;const ull MAX=0x3f3f3f3f3f;const double PI=3.1415926;const double eps=1e-8;double answer[1000010];ull jie[1000010];int n;double a;int main(){ while(cin>>n>>a) { double life=0,love=1e13,ans=0; while(love-life>eps) { double mid=(love+life)/2; double pre1=a,pre2=mid; bool is=true; for(int i=2;i

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。