UVA-701 The Archeologists' Dilemma (数论)

题目大意:给了一个2^E的前缀n,已知前缀n的位数不到2^E的位数的一半,找出满足条件的最小E。

题目解析:设2^E为i位数,则有n*10^i<2^E<(n+1)*10^i。解不等式得到i*log10(n)/log10(2)<E<i*log10(n+1)/log10(2)。从log10(n)+2开始枚举 i 即可。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<algorithm>
using namespace std;
void work(unsigned n)
{
    double u=(double)n;
    int i=log10(u)+2;
    while(1){
        int low=floor(log2(u)+i*log2(10));
        int high=ceil(log2(u+1)+i*log2(10));
        if(high>low+1){
            printf("%d\n",low+1);
            return ;
        }
        ++i;
    }
}
int main()
{
    unsigned n;
    while(scanf("%u",&n)!=EOF)
    {
        work(n);
    }
    return 0;
}

UVA-701 The Archeologists' Dilemma (数论)

时间: 2024-08-03 20:23:55

UVA-701 The Archeologists' Dilemma (数论)的相关文章

(Incomplete)UVa 701 The Archeologist&#39;s Dilemma

方法:对数,暴力 我们需要求出最小的e,是的存在一个i > len(n) , 满足   floor[2^e/ (10^i)]= n, 即 n*10^i < 2^e < (n+1)*10^i.对两边同时取log10 (以10为底的对数,记作lg),得到 lg(n) + i < e*lg(2) < lg(n+1) + i. 注意len(n) = (int) lg(n)+1, 之前一个条件 i > len(n) 可以转化为 i > lg(n)+1,  然后暴力枚举即可.

UVA 1341 - Different Digits(数论)

UVA 1341 - Different Digits 题目链接 题意:给定一个正整数n,求一个kn使得kn上用的数字最少,如果相同,则输出值最小的 思路: 首先利用鸽笼原理证明最多需要2个数字去组成 设一个数字k,组成k,kk,kkk,kkkk... %n之后余数必然在0 - (n - 1)之间,所以必然能选出两个余数相等的数字相减为0,这个数字就是由0和k组成的. 因此只要考虑一个数字和两个数字的情况,去bfs,记忆化余数,因为余数重复必然形成周期了 代码: #include <stdio.

UVA 10693 10693 - Traffic Volume(数论)

题目链接:10693 - Traffic Volume 根据物理知识, 车经过的时间等于,距离/速度,所以可以列出公式t = (l + d)/v,v/2f + d/v,只有当v / 2f = d/v时,时间最小,v = sqrt(2df),之后时间也能算了. #include <stdio.h> #include <string.h> #include <math.h> double l, f; int main() { while (~scanf("%lf%

UVA 618 - Doing Windows(数论)

题目链接:618 - Doing Windows 题意:给定一个大小不能变的屏幕,和四个大小可以变的窗口,变化要保持长宽比,问这四个窗口能不能调整后全部放下正好填满屏幕,不能重叠 思路:情况一共就几种:4个叠一起,3个叠一起+一个,2个和2个,一个和两个叠一起在一个,把这几种情况全判断了就可以了,判断过程利用gcd,lcm可以求边长. 代码: #include <stdio.h> #include <string.h> long long gcd(long long a, long

UVA 1426 - Discrete Square Roots(数论)

UVA 1426 - Discrete Square Roots 题目链接 题意:给定X, N, R,要求r2≡x (mod n) (1 <= r < n)的所有解,R为一个已知解 思路: r2≡x (mod n)=>r2+k1n=x 已知一个r!,带入两式相减得 r2?r12=kn => (r+r1)(r?r1)=kn 枚举A,B,使得 A * B = n (r + r1)为A倍数 (r - r1)为B倍数 这样就可以推出 Aka?r1=Bkb+r1=r => Aka=Bk

uva 10515 - Powers Et Al.(数论)

题目链接:uva 10515 - Powers Et Al. 题目大意:给出m和n,问说mn的个数上的数是多少. 解题思路:其实只要看m的最后一位数就可以了,判断最有一位的周期,然后用n%t即可. #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 15; const int maxs = 105; vector<int> g

UVA 11490 - Just Another Problem(数论)

11490 - Just Another Problem 题目链接 题意:有S个士兵,排成一个矩阵,矩阵中可以有两个洞,要求两个洞上下左右厚度一样,问能缺少士兵的情况数. 思路:推推公式,设厚度为a, 正方形为i, 那么(3 a + 2 i) (2 a + i) = S + 2 i i; 化简一下得到6 i i + 7 a i = S 由于S很大,所以去枚举厚度,这样只要枚举到sqrt(S)就够了,复杂度可以接受 代码: #include <stdio.h> #include <stri

UVA 417 - Word Index(数论)

题意:417 - Word Index 题意:每个字符串按题目中那样去映射成一个数字,输入字符串,输出数字 思路:这题还是比较水的,由于一共只有83000多个数字,所以对应一个个数字去映射就可以了,注意字符串进位的情况处理即可 代码: #include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; char str[10]; map<

UVA 10995 - Educational Journey(数论)

题意:10995 - Educational Journey 题意:给定A遇到C,M,D的时刻和D遇到C,M的时刻,求C遇到M的时刻 思路:先把时间都处理成秒,然后从A遇到C后,从该点出发,A遇到D和C遇到D,就能求出速度Va和Vc之间的关系,由A遇到M后,从该点出发,A遇到D和M遇到D可以推出Va和Vm的关系,从而推出Vc和Vm的关系,然后由C和M遇到点出发,C遇到D和M遇到D的时间可以算,然后又有速度关系,就可以推出他们相遇时间 代码: #include <stdio.h> #includ