Ural 1803(數學,高精度,壓位)

2022-05-24 15:33:10 字數 1806 閱讀 4148

2015-03-01 21:20:58

思路:這題的題意,簡而言之就是給你n和k,讓你求出前n個斐波那契數的各個數字上的數的和,進行排序後輸出。

考慮,首先k的範圍2~10,沒有問題,但是n最大可達到50000,而斐波那契數的增長非常快,40+就能爆int。

所以要高精度+壓位(不壓位會t)

借用下貼吧裡的題解:關於如何確定壓位的進製,我們取滿足:base = k^x <= 10^6,(x為整數)的最大base。這個可以暴力求得。

然後打表計算k進製下[0,base - 1]的各位數字和,剩下的就是高精度加法了。

※:關於如何比較快地打表計算,這裡提供一種方法:

當前要計算a,那麼:sum[a] = sum[a / k] + a % k

如果我們從0計算到base-1,那麼在算a時,a/k必然算過,a/k比a少一位最低位,所以加上最低位a%k即可。

演算法複雜度:o(10^6 + 1741 * 50000)<--(from 貼吧)

注意:這裡可以用滾動陣列,快速輸出優化一下。。。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include

11 #include 12 #include 13

using

namespace

std;

1415

#define mem(a,b) memset(a,b,sizeof(a))

16#define rep(i,n) for(int i=1;i<=(n);++i)

17#define rev(i,n) for(int i=(n);i>=1;--i)

18#define for(i,a,b) for(int i=(a);i<=(b);++i)

19#define rfor(i,a,b) for(int i=(a);i>=(b);--i)

20#define getmid(l,r) ((l) + ((r) - (l)) / 2)

21#define mp(a,b) make_pair(a,b)

2223 typedef long

long

ll;24 typedef pairpii;

25const

int inf = (1

<< 30) - 1;26

const

int maxn = 1000000;27

28int

n,k;

29int

base;

30 ll sum[maxn + 10

];31

32void write(int

v)36

37struct

bigint

40void clear()

41 }bn[3

];42

43 bigint operator +(bigint a,bigint b)

5051

struct

node

58 }nd[50010

];59

60int

main()

80 sort(nd + 1,nd + n + 1

);81

for(int i = 1; i < n; ++i) write(nd[i].id),putchar('');

82 write(nd[n].id),putchar('\n'

);83

return0;

84 }

壓位高精度模板

原先是整型陣列每個元素存1個數字,壓位高精是每位存8個數字,這樣可以加速8唄,空間也減小了。可謂是對整形陣列的充分利用。include include include include include include include include include include include in...

壓位高精度模板

不走程式,直接上板子。第乙個板子壓四位,支援帶符號的加減乘。第二個板子壓九位,支援不帶符號的四則運算和取模。都封裝了。include include include using namespace std struct intx bool operator const intx b const bo...

壓位高精度的寫法

2020 06 10 修正 html 原始碼 2021 12 25 發現這篇隨筆閱讀量破千了,二次修正 html 原始碼,並做了相關補充 壓位高精度的寫法 對於單位高精度演算法,那麼有沒有可以加速 節省空間的做法呢?顯然是有的。以前,存數字陣列裡面只存著乙個數字,所以加減都是一位一位地加,進製也是一...