1 条题解
-
0
#include <bits/stdc++.h> using namespace std; #define ll long long const int mod = 1e9 + 7; //j为2^j<n 的最大的j 左段为前2^j个数的累加,右段是剩下的n-2^j个数的累加 //注意模运算的各种细节 int main() { ll n, k; cin >> n >> k; ll ans = 1;//ans为左半部分的长度 while (ans < n){ ans *= 2; } ans /= 2; ll l = 0, r = 0, num = 0, a, b; //l为左段的和,r为右段的和,num为左段已经累加了多少数了 for (int i = 1; i <= k; i++) { cin >> a >> b; if (num == ans)//属于右边 { r = (r + a % mod * b) % mod; } else if (num + a <= ans)//属于左边 { l = (l + a % mod * b) % mod; num += a;//左边已经有 } else//两边都有 { ll now = ans - num;//左右分界点 l = (l + now % mod * b) % mod;//左边 num += now; //左边已经计算的数 r = (r + (a % mod - now + mod) % mod * b) % mod;//右边 } } cout << (l * l % mod + r * r) % mod << endl; return 0; }
- 1
信息
- ID
- 11
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 89
- 已通过
- 8
- 上传者