说实话 做二分得需要点脑子(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