1 条题解
-
0
不约分 res= n∗( n + 1 ) / 2
考虑约分,对于n来说, 有 t = n / 2 个偶数,每次除2相当于把偶数再减少一半
找规律,可知每次被约分掉的总和是等差数列求1到被约分掉的数字个数之和,也就是t(t+1)/2,所以每次res都减去t(t+1)/2,当!n或!k时停止
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll t, n, k, res; scanf("%lld", &t); while (t--) { scanf("%lld%lld", &n, &k); res = n * (n + 1) / 2; //先用等差数列求和公式求出总和 while (n && k) { n /= 2; //会被约分的数字个数每次都是总长的一半 --k; //每次被约分,2的次数减一 res -= (n * (n + 1) / 2); //找规律,可知每次被约分掉的总和是 等差数列求1到被约分掉的数字个数之和 } printf("%lld\n", res); } return 0; }
- 1
信息
- ID
- 806
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 263
- 已通过
- 36
- 上传者