hdu 6217 A BBP Formula 公式题

https://zh.wikipedia.org/wiki/%E8%B4%9D%E5%88%A9-%E6%B3%A2%E5%B0%94%E6%B8%A9-%E6%99%AE%E5%8A%B3%E5%A4%AB%E5%85%AC%E5%BC%8F

http://blog.csdn.net/meopass/article/details/78327614

这类公式是用来求解一些无理数常数的公式,特点是不需要求解前n-1位也能去算第n位

假设你得到了PI,那么你求十六进制下第n位,只需要把在16进制下的小数点挪到第n-1位和第n位之间,即*16^(n-1),然后去掉整数部分,小数部分再乘16得到的整数部分即是第n位咯

那么如此一来,我们要计算的就是这小数部分咯

对于原累加式,乘16^(n-1)后,由于整数部分可以不管它,那么就让16^(n-1)mod对应的分母,这样小数部分已然不变

对于前n-1项可以如此,那么对于第n项到正无穷项,为了保持精度应该算多少嘞

首先分析精度,小数部分*16得到整数部分就是第n位,小数部分的精度应该要保证*16不影响整数位,对于第n项到正无穷项,对于小数部分的误差是可以允许的

假设最极端的情况下计算小数点后1位,那么要计算的第n项是0.008089 已经小于1e-2 ,乘16的误差也在1e-1以内,如此一来,当n比较大的时候,误差会更小,应该是可以放弃计算第n项到后面的

#include <bits/stdc++.h>

using namespace std;
#define maxn 100010
#define LL long long
//#define double long double
LL quickpower(LL a,LL b,LL MOD )
{
    LL r=1;
    while(b>0)
    {
        if(b&1LL)r=r*a%MOD;
        a=a*a%MOD;
        b>>=1LL;
    }
    return r;
}
double BBP(int n,double a,double b){
    double r=0;
    for(int k=0;k<=n;k++) r+=quickpower(16,n-k,8*k+b)*1.0/(k*8.0+b);
   // for(int k=n+1;k<=n+1000;k++) r+=1/(k*8.0+b)/pow(16,k-n);
    return r*a;
}
double BBPformular(int n){
    return BBP(n,4,1)+BBP(n,-2,4)+BBP(n,-1,5)+BBP(n,-1,6);
}

int main(){
#ifdef shuaishuai
    freopen("C:\\Users\\hasee\\Desktop\\a.txt","r",stdin);
  // freopen("C:\\Users\\hasee\\Desktop\\b.txt","w",stdout);
#endif
    int t;
    scanf("%d",&t);
    for(int c=1;c<=t;c++){
        int n;
        scanf("%d",&n   );
        n--;
        double r=BBPformular(n);
        r=r-(LL)r;
       // printf("%.10f\n",r);
        if(r<0)r+=1.0;
        r*=16;
        int res=r;
        //printf("res:%d r*16:%f\n",res,r);
        printf("Case #%d: %d %c\n",c,n+1,res>9? res-10+‘A‘:res+‘0‘);
    }

    return 0;
}
时间: 2024-10-10 09:44:39

hdu 6217 A BBP Formula 公式题的相关文章

HDOJ(HDU) 2139 Calculate the formula(水题,又一个用JavaAC不了的题目)

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 看到这个时间,我懵逼了... 果然,Java就是打表,都不能AC,因为Java的输入是流,需要的时间比C真的长好多.... Problem Description You just need to calculate the sum of the formula: 1^2+3^2+5^2+--+ n ^2. Input In each

hdu 1999 不可摸数 水题。

不可摸数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7966    Accepted Submission(s): 2024 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数. Input 包

HDU 4085 斯坦纳树模板题

Dig The Wells Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 971    Accepted Submission(s): 416 Problem Description You may all know the famous story "Three monks". Recently they find som

HDU 4280 Island Transport 网络流裸题

非递归版好像被卡掉了,其他2个板子都能过. #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> using namespace std; #define ll int const int MAXN = 100100;//点数的最大值 const int MAXM = 400010;//边数的最大值 const in

HDU 4952 Number Transformation(公式)

HDU Number Transformation 题目链接 题意:按题目中要求求出最后的n 思路:推公式(i+1)x′>=ix,得到x′>=1+floor(xi+1),这样一来就可以递推x,那么注意题目中k很大,但是实际上如果i到一定数值之后,x就不会在增长了,这时候就可以break了 代码: #include <cstdio> #include <cstring> typedef long long ll; ll n, k; int main() { int cas

HDU 4925 Apple Tree(模拟题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 解题报告:给你n*m的土地,现在对每一块土地有两种操作,最多只能在每块土地上进行两种操作,第一种是种苹果树操作,第二种是施肥操作,种苹果树操作可以使得该块地 长出一个苹果,施肥操作可以使得与这块土地相邻的土地的苹果产量变为原来的两倍,问可以得到的最多的苹果数量是多少? 例如一个4*4的土地,用1表示在该土地上做第一种操作,0表示在该土地上做第二种操作,可以得到最多苹果的操作如下: 0 1 0

HDU Senior&#39;s Gun (水题)

题意:给n把枪,m个怪兽,每把枪可消灭1怪兽,并获得能量=枪的攻击力-怪兽的防御力.求如何射杀能获得最多能量?(不必杀光) 思路:用最大攻击力的枪杀防御力最小的怪兽明显可获得最大能量.如果每把枪都去射杀刚好1点能量都拿不到的怪物,那简直等于把枪全丢掉. 1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <iostream> 3 #include <stdio.h> 4 #inc

hdu 4970 Killing Monsters(简单题) 2014多校训练第9场

Killing Monsters                                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Kingdom Rush is a popular TD game, in which you should b

HDU 4940 Destroy Transportation system 规律题

答案只有2种情况,所以ans = rand()%2; if(ans)puts("happy") else puts("unhappy"); == 想过无源汇的网络流,还是比较麻烦的,然后没往下想... 设s点集有一些点, 多加一个点一定是y增加比较快_(:зゝ∠)_ 然后设s点集只有一个点 #include <cstdio> #include <map> #include <set> #include <algorithm&