[CCPC2020绵阳L] Lottery
Description
给你 n 组 a x(每个 a 都相同),代表有 x 个 2 ^ a,问用这些数字最多组成多少种不同的数字。
Solution
相同的元素最多保留两个,多的变成大的
非连续的不会相互影响(因为和不够),所以相互独立
每段连续的以最小的为单位求和再加一,乘起来就是答案
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9 + 7;
int cid = 0;
void solve()
{
int n;
cin >> n;
map<int, int> src;
while (n--)
{
int a, x;
cin >> a >> x;
src[a] += x;
}
for (auto &[x, y] : src)
{
if (y > 2)
{
src[x + 1] += (y - 1) / 2;
y -= (y - 1) / 2 * 2;
}
}
vector<pair<int, int>> vec;
for (auto [x, y] : src)
if (y > 0)
vec.push_back({x, y});
int m = vec.size();
int l = 0, r;
int ans = 1;
while (l < m)
{
int sum = 1 + vec[l].second, bas = 1;
r = l + 1;
while (r < m && vec[r].first == vec[r - 1].first + 1)
{
bas *= 2;
sum += bas * vec[r].second;
bas %= mod;
sum %= mod;
++r;
}
ans *= sum;
ans %= mod;
l = r;
}
++cid;
cout << "Case #" << cid << ": ";
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
solve();
}