日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3150 Pibonacci数 - Wikioi

發布時間:2023/12/9 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3150 Pibonacci数 - Wikioi 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題目描述 Description

???   你可能聽說過的Fibonacci數和圓周率Pi。

???   如果你讓這兩個概念合并,一個新的深奧的概念應運而生:Pibonacci數。

???   這些數可以被定義為對于x>=0:

???     如果0<=x<4,則P(x) = 1

???     如果4<=x,則P(x) = P(x - 1) + P(x - pi)

???   其中Pi = 3.1415926535897...在這個問題中,你被要求計算對于一個給定的非負整數x對應P(x)的值。

輸入描述 Input Description

???   一個非負整數x。

輸出描述 Output Description

???   一個正整數P(x)。

樣例輸入 Sample Input

??? 11

樣例輸出 Sample Output

??? 20

數據范圍及提示 Data Size & Hint

??? 數據范圍 x<=30000

??? ?

??? 來源 ICPC 2001 F

?

好題啊

轉化題意,給你一個數,你可以一次減去1,或者減去pi,求你有多少種方法把它減到<4(如果它本來就小于4,方案就是1種)

想法1

枚舉1的個數算出pi的個數,這是pi結尾的,算組合數

枚舉pi的個數算出1的個數這是1結尾的,算組合數

然后加起來

眼瞎,以為只有3000,高興地交上去,RE了,我靠竟然有30000,怎么辦呢

問了問VFleaking,他想了想,幫我找出了一個有巨大優化空間的地方

我求組合數是暴力求的,其實枚舉的時候組合數的n,m都是比較接近的,所以記一個lastn和一個lastm每次只要乘幾個除幾個就行了

然后優化到了10000左右可以過,又卡住了

FVleaking找到了差不多的題http://acm.hit.edu.cn/hoj/problem/view?id=1385

范圍是3000,多組數據,我就交了,AC了,于是我的信心倍增,但是還是不知道怎么過30000

然后下了一個C++AC代碼(當時也只有C和C++的)

看了以后果然是常數比我好

直接枚舉pi的個數為n

然后給剩下的空間加上一個pi,算出這個空間可以容下多少個1,個數為m

可以想象,加上一個pi,pi的個數還是原來枚舉的那么多(因為這個空間加上這些pi和1肯定還沒滿)

所以討論1擺放情況,因為有可能1結尾,但是超出范圍,根本不需要這個1,但是沒關系這個方案只計算了一次也只會計算這一次,所以方案數就是C(n+m,n)

然后加上前面那個優化,就可以AC了..........

?

1 const 2 h=100000000000000; 3 type 4 aa=array[0..10000]of int64; 5 var 6 a,b:aa; 7 n:longint; 8 9 procedure cheng(x:longint); 10 var 11 i:longint; 12 begin 13 for i:=1 to b[0] do 14 b[i]:=b[i]*x; 15 for i:=1 to b[0] do 16 begin 17 inc(b[i+1],b[i]div h); 18 b[i]:=b[i]mod h; 19 end; 20 i:=b[0]+1; 21 while b[i]>0 do 22 begin 23 inc(b[0]); 24 b[i+1]:=b[i]div h; 25 b[i]:=b[i]mod h; 26 inc(i); 27 end; 28 end; 29 30 procedure jia; 31 var 32 i:longint; 33 begin 34 for i:=1 to b[0] do 35 inc(a[i],b[i]); 36 if b[0]>a[0] then a[0]:=b[0]; 37 for i:=1 to a[0] do 38 begin 39 inc(a[i+1],a[i]div h); 40 a[i]:=a[i]mod h; 41 end; 42 i:=a[0]+1; 43 while a[i]>0 do 44 begin 45 inc(a[0]); 46 inc(a[i+1],a[i]div h); 47 a[i]:=a[i]mod h; 48 inc(i); 49 end; 50 end; 51 52 procedure chu(x:longint); 53 var 54 i:longint; 55 begin 56 for i:=b[0] downto 2 do 57 begin 58 inc(b[i-1],(b[i]mod x)*h); 59 b[i]:=b[i]div x; 60 end; 61 b[1]:=b[1]div x; 62 while (b[b[0]]=0)and(b[0]>1) do 63 dec(b[0]); 64 end; 65 66 procedure print; 67 var 68 i:longint; 69 k:int64; 70 begin 71 write(a[a[0]]); 72 for i:=a[0]-1 downto 1 do 73 begin 74 k:=h div 10; 75 while k>1 do 76 begin 77 if a[i]<k then write(0); 78 k:=k div 10; 79 end; 80 write(a[i]); 81 end; 82 end; 83 84 procedure main; 85 var 86 i,j,k,last:longint; 87 begin 88 read(n); 89 if n<4 then 90 begin 91 write(1); 92 halt; 93 end; 94 dec(n,4); 95 a[0]:=1; 96 a[1]:=1; 97 i:=0; 98 b[0]:=1; 99 b[1]:=1; 100 i:=1; 101 j:=trunc(n+pi); 102 while i<=trunc((n+pi)/pi) do 103 begin 104 last:=j; 105 j:=trunc(n+pi-i*pi); 106 for k:=last-1 downto j+1 do 107 begin 108 cheng(k+1); 109 chu(i+k); 110 end; 111 cheng(j+1); 112 chu(i); 113 inc(i); 114 jia; 115 end; 116 print; 117 end; 118 119 begin 120 main; 121 end. View Code

?

轉載于:https://www.cnblogs.com/Randolph87/p/3599458.html

總結

以上是生活随笔為你收集整理的3150 Pibonacci数 - Wikioi的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。