定義\(F(n)\)爲\(n\)的最大奇因數,例如\(F(1) = 1\),\(F(6) = 3\),\(F(12) = 3\)。
輸入\(m\),求\(\sum\limits_{i = 1}^{m}F(i)\)。
\(m \leq 10^{100}\)
分析一下咱們發現,若是\(i\)是偶數,\(F(i) = F(i / 2)\),這樣的話就能夠分治求了。
這題難度在高精,誰考場上寫大高精啊html
r = open('sigma.in','r') w = open('sigma.out','w') ans = 0 def sove(*t): global ans x = int(t[0]) if x == 0: return None if x % 2 == 1: ans += (x + 1) * (x + 1) // 4 else: ans += x *x // 4 sove(x // 2) n = r.read() sove(n) w.write(str(ans))
固然能夠不遞歸求c++
r = open('sigma.in', 'r') w = open('sigma.out', 'w') ans= 0 n = int(r.read()) while(n != 0): if(n & 1): ans += (n + 1) * (n + 1) // 4 else: ans += n * n // 4 n //= 2 w.write(str(ans))
如下是c++的代碼。高精類過大沒有放。
高精類模板spa
signed main() { freopen("sigma.in", "r", stdin); freopen("sigma.out", "w", stdout); GNUM n; GNUM zero(0); cin >> n; GNUM ans(0); while (!(n == zero)) { if (n.opd()) ans = ans + (n + 1) * (n + 1) / 4; else ans = ans + n * n / 4; n = n / 2; } cout << ans << endl; return 0; }
小強的激光塔陣共有\(P\)座激光塔,它們被建造在一個$N \times M \(的矩形網格上。每座激光塔都有本身的座標\)(x,y)\(,其中\)x(1 \leq x \leq n)\(和\)y(1 \leq y \leq m)\(均爲整數。當兩座激光塔的\)x\(座標和\)y\(座標至少一個相同時,這兩座塔就能夠產生聯繫。若激光塔\)A\(與\)B\(有聯繫,\)B\(與\)C\(也有聯繫,則能夠認爲\)A\(與\)C$也有聯繫。可是如今激光塔並不必定兩兩都有聯繫,因此他想新建一些新的激光塔使得激光塔兩兩都有聯繫。
你要計算並輸出小強最少須要建造多少個激光塔。
顯然並查集維護一下有幾個連通塊就能夠了。code
int main() { freopen("laser.in", "r", stdin); freopen("laser.out", "w", stdout); poread(n), poread(m), poread(p); for(register int i = 1; i <= p; ++i) poread(data[i].x), poread(data[i].y), data[i].id = i; for(register int i = 1; i <= p; ++i) fa[i] = i; sort(data + 1, data + 1 + p, cmp1); for(register int i = 2; i <= p; ++i) { if(data[i - 1].x == data[i].x) { register int x = find(data[i - 1].id), y = find(data[i].id); if(x == y) continue; fa[y] = x; } } sort(data + 1, data + 1 + p, cmp2); for(register int i = 2; i <= p; ++i) { if(data[i - 1].y == data[i].y) { register int x = find(data[i - 1].id), y = find(data[i].id); if(x == y) continue; fa[y] = x; } } register int ans = 0; for(register int i = 1; i <= p; ++i) { if(find(i) == i) { ++ans; } } printf("%d", ans - 1); }
這題是個語文題不放題面了。大概就是每次求次短路都從次短路進行轉移。
只放垃圾跑的賊慢的\(spfa\)了。htm
inline void sspfa() { queue<int> q; memset(d, 0x3f, sizeof(d)); memset(md, 0x3f, sizeof(md)); for(register int i = 1; i <= k; ++i) { d[ek[i]] = md[ek[i]] = 0; g[ek[i]] = mg[ek[i]] = ek[i]; q.push(ek[i]); v[ek[i]] = 1; } while(q.size()) { register int x = q.front(); q.pop(); v[x] = 0; for(register int i = head[x]; i; i = e[i].nxt) { register int y = e[i].ver; if(d[y] > md[x] + e[i].edge) { if(g[y] != x) md[y] = d[y], mg[y] = g[y]; d[y] = md[x] + e[i].edge; g[y] = x; if(!v[y]) q.push(y), v[y] = 1; } else if(md[y] > md[x] + e[i].edge && g[y] != x) { md[y] = md[x] + e[i].edge; mg[y] = x; if(!v[y]) q.push(y), v[y] = 1; } } } }