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



