hdu4430_Yukari's Birthday(数学放缩+二分)



///////////////////////////////////////////////////////////////////////////////////////////////////////

作者:tt2767

声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0

查看本文更新与讨论请点击:http://blog.csdn.net/tt2767

链接被删请百度: CSDN tt2767

///////////////////////////////////////////////////////////////////////////////////////////////////////



题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430

题解:

本题根据蛋糕中心放不放蜡烛可以转化为 k1+k2+……+kr=n或n?1

已知:等比数列求和公式n=k(kr?1)k?1

我们知道18 ≤ n ≤ 1012 由此可以求出来r最大是45

由于r是有限d,所以我们可以枚举r,然后从结果中二分查找k的值。

如果把r当作已知量,对于k来说,可以用n=k(kr?1)k?1来求出k,但这样求解比较麻烦,我们知道n=k(kr?1)k?1≥k?1k?1(kr?1)此时k≤(n+1)1r。

故在2≤k≤(n+1)1r,查找k的值即可。


#include<sstream>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include <iterator>
#include<vector>
#include<map>
#include <stack>
#include<queue>
#include <list>
#include<functional>
#include<numeric>
using namespace std;
#define lch(x)  ((x) << 1)
#define rch(x) ((x)<<1|1)
#define dad(x) ((x)>>1)
inline int lowbit(int x){return x&(-x);}
typedef  long long int LL;
const int INF = 0x5f5f5f5f ;
const double eps = 1e-6;
const long double PI = acos(0.0) * 2.0;
LL R,K,n;
LL Power(LL x, LL y);
void judge(LL r,LL k,LL& R,LL& K );

int main()
{
    while(scanf("%lld",&n)==1)
    {
        K = n-1,R = 1;
        for(int r = 2 ; r <= 45 ; r++)      //枚举r
        {                           //k的右边界由等比数列缩放而来
            LL left = 2 , right = (LL)pow(n+1,1.0/r);
            while(left <= right)
            {
                LL mid  = (left+right)>>1;      //二分查找k

                LL ans = mid*(Power(mid,r)-1)/(mid-1);//等比数列求和计算结果

                if(ans == n || ans == n-1)//符合中心放或者不放蜡烛的时候
                {
                    judge(r,mid,R,K);   //更新R,K的值
                    break;
                }
                else if(ans > n )
                    right = mid - 1;
                else
                    left = mid + 1;
            }
        }
        printf("%lld %lld\n",R,K);
    }
    return 0;
}

LL Power(LL x, LL y)
{
    LL res = 1;
    for(LL i = 0 ; i < y ; i++)
        res *= x;
    return res;
}

void judge(LL r,LL k,LL& R,LL& K )
{
    if(r*k < R*K)
    {
        R = r;
        K = k;
    }
    else if(r*k == R*K  && r < R)
    {
        R = r;
        K = k;
    }
}

版权声明:本文为博主原创文章,允许非商业性转载,转载必须注名作者(CSDN tt2767)与本博客链接:http://blog.csdn.net/tt2767。

hdu4430_Yukari's Birthday(数学放缩+二分)

时间: 2024-10-12 15:22:54

hdu4430_Yukari's Birthday(数学放缩+二分)的相关文章

poj 1905 Expanding Rods (数学 计算方法 二分)

题目链接 题意:将长度为L的棒子卡在墙壁之间.现在因为某种原因,木棒变长了,因为还在墙壁之间,所以弯成了一个弧度,现在求的是弧的最高处与木棒原先的地方的最大距离. 分析: 下面的分析是网上别人的分析: 设弦长为L0(即原长),弧长为L1=(1+n*C)*l0,目标值为h,半径为R,弧所对圆心角为2θ(弧度制).可以得到以下方程组:圆的弧长公式:L1=2θR三角函数公式:L0=2*R*sinθ,变换得θ=arcsin(L0/(2*R))勾股定理:R^2=(R-h)^2+(0.5*L0)^2,变换得

hdoj 3750 Guess Game 【数学之二分】

题意:用二分法找出数学期望. 策略,二分. 求数学期望有两种方法,一:求出每一个数的概率,再与数相乘,最后把所有的乘积相加就好了. 二:数学期望总是与平均数相等,所以可以当做求平均数.(简单方便) 代码: #include <stdio.h> #include <string.h> int sum; void bi_sear(int n){ sum = 0; int temp, i, left, right, mid; for(i = 1; i <= n; i ++){ te

Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树

Codeforces Round #470 B. Primal Sport 数学题,对 x2 和 x1 分解质因子即可. #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;

Really Big Numbers CodeForces - 817C (数学规律+二分)

C. Really Big Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Ivan likes to learn different things about numbers, but he is especially interested in really big numbers. Ivan thinks

一元三次方程求解(数学、二分)

https://www.luogu.com.cn/problem/P1024 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求三个实根. Input 四个实数:a,b,c,d Output 由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位 Sample Input 1 -5 -4

poj 1905 Expanding Rods(木杆的膨胀)【数学计算+二分枚举】

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13516   Accepted: 3484 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe

hdu5646数学构造+二分

/* 满足n>=(k+1)*k/2的整数n必定满足 a+(a+1)+...+(a+k-1)<=n<=(a+1)+(a+2)+...+(a+k) 只要在[a,a+k]中减掉一个数字ai,就有n=sum(a,a+k)-ai;且其乘积能达到最大 那么二分先找到a,如果n=sum(a,a+k-1),那么已经是答案了,否则减去那个ai即可 */ #include<bits/stdc++.h> #define mod 1000000007 #define ll long long usi

数学问题-二分求幂例题

例 4.10 人见人爱 A ^ B  题目描述 求 A^B 的最后三位数表示的整数.说明:A^B 的含义是“A 的 B 次方” 输入 输入数据包含多个测试实例,每个实例占一行,由两个正整数 A 和 B 组成 ( ),如果 A=0, B=0,则表示输入数据的结束,不做处理. 输出 对于每个测试实例,请输出 A^B 的最后三位表示的整数,每个输出占一行. 样例输入 2 3 12 6 6789 10000 0 0 样例输出 8 984 1 解题代码 #include<cstdio> int main

济南学习 Day1 T3 pm

[问题描述]小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在x轴正半轴和y轴正半轴分别挑选??个点.随后,他将x轴的点与y轴的点一一连接,形成??条线段,并保证任意两条线段不相交.小 Q 确定这种连接方式有且仅有一种.最后,小 Q 会给出m个询问.对于每个询问,将会给定一个点P(Px ,Py),请回答线段 OP 与m条线段会产生多少个交点?小 Q 找到了正在钻研数据结构的你,希望你可以帮他解决这道难题.[输