HDOJ6217BBP Formula(数学公式)

Posted myx12345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ6217BBP Formula(数学公式)相关的知识,希望对你有一定的参考价值。

题意:给定一个无穷项的分式,它的和等于π,问π的十六进制表示的小数点后第n位是多少

1 ≤ n ≤ 100000

思路:From https://blog.csdn.net/meopass/article/details/78327614

技术分享图片

C++double写起来细节真是烦

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N   11000
21 #define M   41
22 #define eps 1e-8
23 #define pi acos(-1)
24 
25 
26 
27 int read()
28 { 
29    int v=0,f=1;
30    char c=getchar();
31    while(c<48||57<c) {if(c==-) f=-1; c=getchar();}
32    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
33    return v*f;
34 }
35 
36 ll Pow(ll a,ll b,ll MOD)
37 {
38     ll ans=1;
39     while(b)
40     {
41         if(b&1) ans=ans*a%MOD;
42         a=a*a%MOD;
43         b>>=1;
44     }
45     return ans;
46 }
47 
48 double BBP(int n,ll k,ll b)
49 {
50     double ans=0;
51     for(int i=0;i<=n;i++) ans+=(Pow(16,n-i,8*i+b)*1.0/(8*i+b));
52     for(int i=n+1;i<=n+1001;i++) ans+=(powf(16,n-i)/(8*i+b));
53     return k*ans;
54 }
55 
56 int main()
57 {
58     //freopen("hdoj6217.in","r",stdin);
59     //freopen("hdoj6217.out","w",stdout);
60     int cas;
61     scanf("%d",&cas);
62     for(int v=1;v<=cas;v++)
63     {
64         int n;
65         scanf("%d",&n);
66         n--;
67         double ans=0.0;
68         ans=BBP(n,4,1)+BBP(n,-2,4)+BBP(n,-1,5)+BBP(n,-1,6);
69         ans-=int(ans);
70         if(ans<0) ans++;
71         ans*=16;
72         char ch;
73         int p=int(ans);
74         if(0<=p&&p<=9) ch=p+0;
75          else if(p==10) ch=A;
76          else if(p==11) ch=B;
77          else if(p==12) ch=C;
78          else if(p==13) ch=D;
79          else if(p==14) ch=E;
80          else if(p==15) ch=F;
81         printf("Case #%d: %d %c
",v,n+1,ch);
82         
83     }
84     return 0;
85 }
86      

 

以上是关于HDOJ6217BBP Formula(数学公式)的主要内容,如果未能解决你的问题,请参考以下文章

[HDOJ5734]Acperience(数学,公式推导)

你觉得最神奇的数学公式推导是啥?

Machin formula /梅钦公式

HDOJ:6333-Problem B. Harvest of Apples(组合数学+莫队算法+逆元)

hdu6217(数学)

HDOJ1153 Magic Bitstrings组合数学