2 条题解
-
1
对于所有的数, 最多需要乘以 次, (即 翻 倍)
而
接下来q行
输入的是不需要被翻倍的数, 每被指明不需要翻倍一次, 我们就对它进行计数一次, 如果arr[i]
被 指明不需要翻倍que[i]
次, 则最终它只需要翻倍q - que[i]
次即
则 $sum = (\sum_{i=0}^{n-1}arr[i] \times 2^{q - que[i]}) \mod (1e9+7)$
代码如下:
#include <cstdio> #include <vector> using namespace std; int mod = 1e9 + 7; using ll = long long; ll ppow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; b >>= 1; a = a * a % mod; } return res; } int main() { int n, q; scanf("%d %d", &n, &q); vector<int> arr(n); for (int i = 0; i < n; ++i) scanf("%d", &arr[i]); vector<int> que(n, 0); for (int i = 0; i < q; ++i) { int j; scanf("%d", &j); ++que[j - 1]; } long long sum = 0; for (int i = 0; i < n; ++i) { sum = (sum + arr[i] * ppow(2, q - que[i])) % mod; } printf("%lld\n", sum); return 0; }
使用快速幂计算一个数为 ,
计算 n 个数 为 O(NlogN) (时间复杂度)
信息
- ID
- 100
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 246
- 已通过
- 46
- 上传者