HDU - 4430 - Yukari's Birthday

题目链接:https://vjudge.net/problem/HDU-4430

题目大意:

给出一个n,求出一个r和k,使得首项是k,公比是k的前0~r项和为n,且r*k尽量小。

题目分析:

首先利用等比数列的前n项和公式大概估算出r的大小范围大概最多为45左右。

此时可以枚举r,二分k,求得符合题意的r和k。

注意在二分的过程中可能会溢出,要进行预处理。

注:一开始n开成了int ,WA了一晚上,有毒。

给出代码:

#include <cstdio>
#include <iostream>
#include <string>
#include <set>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
long long int n;
long long int find(long long int x)
{
    long long int l=2,r=n,mid,i;
    while(l<=r)
    {
        //cout<<mid<<endl;
        mid=(l+r)/2;
        long long int sum=1;
        long long int ans=0;
        for(i=1; i<=x; i++)
        {
            if(n/sum<mid)
            {
                ans=n+1;
                break;
            }
            sum*=mid;;
            ans+=sum;
            if(ans>n)
                break;
        }
        if(ans==n||ans==n-1)
            return mid;
        else
        {
            if(ans<n-1)
                l=mid+1;
            else
                r=mid-1;
        }
    }
    return -1;

}
int main()
{
    //cin>>n;
    while(cin>>n)
    {
        //long long int minn=n-1;
       /* if(n==1)
        {
            cout<<0<<" "<<1<<endl;
            continue;
        }*/
        long long int r=1,k=n-1,i;
        for(i=2; i<=45; i++)
        {
            long long int t=find(i);
          //  cout<<t<<" "<<i<<endl;
            if(t==-1)
                continue;
            if(t*i<k*r)
            {
             //   minn=t*i;
                r=i;
                k=t;
            }
        }
        cout<<r<<" "<<k<<endl;
    }
    return 0;
}

HDU - 4430 - Yukari's Birthday

时间: 2024-08-26 07:10:43

HDU - 4430 - Yukari's Birthday的相关文章

hdu 4430 Yukari&#39;s Birthday 枚举+二分

注意会超long long 开i次根号方法,te=(ll)pow(n,1.0/i); Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3262    Accepted Submission(s): 695 Problem Description Today is Yukari's n-th birt

hdu 4430 Yukari&#39;s Birthday(二分)

Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2703    Accepted Submission(s): 556 Problem Description Today is Yukari's n-th birthday. Ran and Chen hold a celebration party

HDU 4430 &amp; ZOJ 3665 Yukari&#39;s Birthday(二分+枚举)

题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4888 Problem Description Today is Yukari's n-th birthday. Ran and Chen hold a celebration party for her. Now comes the most import

HDOJ 4430 Yukari&#39;s Birthday 【枚举】+【二分】

题意:有一个蛋糕,将所有的蜡烛摆成一个以中心为同心轴的同心圆(中心可以放一个或者一个也不放,由近到远编号(1~r)每一个圆上分别放k^i(i是第几个的序号, k>=2)), 给你总的蜡烛数,让你求出k*r最小的,如果k*r相等,取r较小的. 分析:由等比数列可得k^0+k^1+...+k^r = (1-k^(r+1))/(1-k) 小于等于10e12,k最小是2,算出来r<40,那么我们可以枚举r,然后二分查找k,但是如果按照正常的二分,TL了(6s都TL...),分析发现,算幂的时候可能会溢

HDOJ 4430 Yukari&#39;s Birthday

C++高精度问题太蛋疼了.... Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2891    Accepted Submission(s): 604 Problem Description Today is Yukari's n-th birthday. Ran and Chen hold a

(最长回文串 模板) 最长回文 -- hdu -- 3068

http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12079    Accepted Submission(s): 4430 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长

hdu 1548 (dijkstra解法)(一次AC就是爽)

恭喜福州大学杨楠获得[BestCoder Round #4]冠军(iPad Mini一部) <BestCoder用户手册>下载 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11670    Accepted Submission(s): 4430 Problem Description There is

hdu 1217 (Floyd变形)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4430    Accepted Submission(s): 2013 Problem Description Arbitrage is the use of discr

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;