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 #include8 #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 原始碼,並做了相關補充 壓位高精度的寫法 對於單位高精度演算法,那麼有沒有可以加速 節省空間的做法呢?顯然是有的。以前,存數字陣列裡面只存著乙個數字,所以加減都是一位一位地加,進製也是一...