1.《数学之美》讲的是数学发展史和一些复杂算法背后简单的原理,其实看似一个很难的问题的背后,有一个简单而又纯粹的东西。那是不是以后做题的时候,能运用这些简单又纯粹的想法呢?《数学之美》中比较感兴趣的是图论和分治算法,但是我实在太浮躁,不能很有耐心的看完,以后慢慢看。
算法在软件开发中可以更为简单的解决一些比较困难的问题,《数学之美》里面都是运用一些朴素的算法,然后实现了一个特别有用搜索功能。
本学期的目标:写一个代码查重的一个插件
2.我找到的一个比较优美的代码是
typedef long long ll; struct base { ll a[63]; vector<ll> p; bool flag;//标记答案集合中是否有0 base() { fill(a, a + 63, 0ll); flag = false; } void init() { fill(a, a + 63, 0ll); p.clear(); flag = false; } bool insert(ll val) { ll t = 1ll << 62; for (int i = 62; ~i; --i) { if (val & t) { if (!a[i]) { a[i] = val; return true; } val ^= a[i]; } t >>= 1; } flag = true;//能到这里说明能异或出0 return false; } ll query_max() { ll ans = 0; for (int i = 62; ~i; --i) if ((ans ^ a[i]) > ans) ans ^= a[i]; return ans; } ll query_min() { for (int i = 0; i <= 62; ++i) { if (a[i]) return a[i]; } return 0; } void rebuild() { ll t; for (int i = 62; ~i; --i) { if (!a[i]) continue; t = 1ll << i - 1; for (int j = i - 1; ~j; --j, t >>= 1) if (a[i] & t) a[i] ^= a[j]; } for (int i = 0; i <= 62; ++i) if (a[i]) p.push_back(a[i]); } ll kth(ll k) { if (flag) --k;//答案集合中有0 ll ans = 0; if (k >= (1ll << p.size())) return -1; ll t = 1ll << 62; for (int i = 62; ~i; --i, t >>= 1) if (k & t) ans ^= p[i]; return ans; } inline ll &operator[](int i) { return a[i]; } base operator+(base &b) const { base ans = *this; for (int i = 0; i <= 62; ++i) if (b[i]) ans.insert(b[i]); return ans; } };
来源https://blog.csdn.net/Apale_8/article/details/97576727
3.最近打代码有些原来没有注意到的小细节
1.迭代比循环要慢的
2.斐波那契数列的各个项的个位数每60一个循环,f[90]超过了long long int的范围
(忘了看的哪个博客,就无来源)