1 条题解
-
0
解题思路
如果我们直接模拟整个过程,会超时,因为 太大。所以需要一些简单的观察:
- 如果 是偶数,那么每次操作中 都会加上 ,并且始终保持偶数。
- 如果 是奇数,那么第一次操作会使 加上一个奇数,之后 变成偶数。
因此,很容易看出答案如下:
-
当 是偶数时:
-
当 是奇数时:
设 为 的最小正因子(除了 以外)。第一次操作后, 变为 ,这是一个偶数。之后剩余的 次操作,每次加上 。因此:
其中 可以在 时间内计算(实际实现中通常 预处理,但这里每个 单独计算也很快)。
总复杂度为 。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; int main() { int T; cin >> T; while(T--) { int n,k; cin >> n >> k; if(n%2==0) { cout << n+2*k << endl; continue; } int p = 0; for(int i = n; i>=2; i--) if(n%i==0) p = i; cout << n+p+2*(k-1) << endl; } return 0; }
- 1
信息
- ID
- 6882
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者