2017 ACM-ICPC 亞洲區(西安賽區)網路賽 E Maximum Flow
阿新 • • 發佈:2019-02-20
題目連結
題意
有
思路
首先,
其次,對於任意一個
這樣割,肯定有一個點為分界線(
現在的問題就是怎麼求割下來的各條邊的流量和。
當
當
對於這些數,其
Code
#include <bits/stdc++.h>
typedef long long LL;
const LL mod = 1e9+7;
LL n;
void work() {
if (n == 2) { printf("1\n"); return;}
--n;
int len = 0;
LL nn = n;
while (nn) ++len, nn >>= 1;
LL ans = (1LL << (len-2)) % mod * (((1LL << (len-1)) - 1 + mod) % mod) % mod;
(ans += n) %= mod ;
for (int i = 0; i < len-1; ++i) {
if (n & (1LL << i)) {
if (i == 0) (ans += 1) %= mod;
else (ans += (((3LL << i) % mod - 1 + mod) % mod * ((1LL << (i-1)) % mod)) % mod) %= mod;
}
}
printf("%lld\n", ans);
}
int main() {
while (scanf("%lld", &n) != EOF) work();
return 0;
}