HDU4430 Yukari's Birthday(枚举+二分)
Yukari's Birthday HDU4430
就是枚举+二分:
注意处理怎样判断溢出。。。(因为题目只要10^12)
先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64)
而且这样判断会超时的。。。
还有题目中的And it's optional to place at most one candle at the center of the cake. (中间的蜡烛可有可无)
还有观察数据就知道:因为n最大10^12,r最多枚举到40,然后二分k的结果,看是否有符合条件的k存在。
1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 const __int64 N=1000010; 6 __int64 fun1(__int64 k,__int64 r,__int64 n) 7 { 8 __int64 s=0,t=k; 9 for(int i=1;i<=r;i++) 10 { 11 s+=t; 12 if(s > n)//判断在求和的过程中是否已经比n大(可省时很多且不会超__int64) 13 return N*N; 14 t*=k; 15 } 16 return s; 17 } 18 __int64 fun(__int64 r,__int64 n) 19 { 20 if(r == 1) 21 return n; 22 __int64 mid,p,lef=2,rig=N; 23 while(lef <= rig) 24 { 25 mid=(lef+rig)/2; 26 p=fun1(mid,r,n); 27 if(p == n) 28 return mid; 29 if(n > p) 30 lef=mid+1; 31 else 32 rig=mid-1; 33 } 34 return -1; 35 } 36 int main() 37 { 38 __int64 n,p,r,rr,rp; 39 while(scanf("%I64d",&n)!=EOF) 40 { 41 rr=N;rp=N; 42 for(r=1;r<=40;r++)//只要到40就行了 43 { 44 p=fun(r,n);//中间放蜡烛 45 if(p!=-1) 46 if(r*p < rr*rp || (r*p == rr*rp && r < rr)) 47 { 48 rr=r; 49 rp=p; 50 } 51 p=fun(r,n-1);//中间不放蜡烛 52 if(p!=-1) 53 if(r*p < rr*rp || (r*p == rr*rp && r < rr)) 54 { 55 rr=r; 56 rp=p; 57 } 58 } 59 printf("%I64d %I64d\n",rr,rp); 60 } 61 return 0; 62 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步