zoukankan      html  css  js  c++  java
  • hdu 6217 A BBP Formula 公式题

    题意

    已知公式:$pi=sum_{k=0}^{infty}left[frac{1}{16^{k}}left(frac{4}{8 k+1}-frac{2}{8 k+4}-frac{1}{8 k+5}-frac{1}{8 k+6} ight) ight]$

    求 $pi$ 的第 $n$ 项。

    分析

    WIKI上有:π的BBP位抽取算法

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

    将公式乘以 $16^n$ 就能将小数点移动到第 $n$ 位。

    我们只需要将小数点移动到第 $n-1$ 位,减去整数部分,将小数部分乘 16 就是16进制下的第 $n$ 位。

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    int  n;
    ll qpow(ll a, ll b, ll mod)
    {
        ll ret = 1;
        while(b)
        {
            if(b&1)  ret = ret * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return ret;
    }
    
    double  BBP(int c1, int c2, int  n)
    {
        double ret = 0.0;
        for(int i = 0;i <= n;i++)  ret += qpow(16, n-i, 8*i+c2)*1.0/(8*i+c2);
        return c1*ret;
    }
    
    int main()
    {
        int T, kase = 0;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d", &n);
            double res = BBP(4, 1, n-1) - BBP(2, 4, n-1) - BBP(1, 5, n-1) - BBP(1, 6, n-1);
            res = res - (int)res;
            if(res < 0)  res = res + 1;
            printf("Case #%d: %d ", ++kase, n);
            int ans = (int)(res*16);
            if(ans < 10)  printf("%d
    ", ans);
            else  printf("%c
    ", 'A'+ans-10);
        }
        return 0;
    }

    参考链接:https://www.cnblogs.com/LzyRapx/p/7802790.html 

  • 相关阅读:
    获取deeplearning电子书
    iterm2 粘贴时有多余字符 0~ 1~
    linux mint使用中的问题解决记录
    column命令
    命令行中画图
    sphinx转pdf显示中文
    linux查看显卡
    python 3.6
    Mac笔记本中使用postgresql
    计算KS值的标准代码
  • 原文地址:https://www.cnblogs.com/lfri/p/11705042.html
Copyright © 2011-2022 走看看