ABC 190 D(I hate Math)
我又回来了!
由于开学了,所以博客更的会比较少。
题面
有多少个整数序列是一个公差为 $ 1 $ 且和为 $ N $ 的等差数列?
思路
看等差数列
\[A, A + 1, A + 2, \cdots, B
\]
它的和为
\[\frac {(A + B)(B - A + 1)} {2}
\]
所以答案为满足
\[(A + B)(B - A + 1) = 2N \qquad (A < B)
\]
的 $ A, B $ 的组数。
设
\[\begin{cases}
A + B = x \\
B - A + 1 = y \\
xy = 2N
\end{cases}
\]
这个方程的解为
\[\begin{cases}
A = \frac {x - y + 1} {2} \\
B = \frac {x + y - 1} {2}
\end{cases}
\]
所以,
\[x \equiv y - 1 \qquad (\text{mod} \ 2)
\]
(对不起找不到不同余的符号)
枚举可。
其实,我们可以不断除 $ 2 $,直到不可除为止。
这次不用奇偶不同了。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
long long N;
scanf("%lld", &N);
while (N % 2 == 0) {
N /= 2;
}
long long i, ans = 0;
for (i = 1; i * i <= N; i++) {
if (N % i == 0) {
ans += 2;
}
}
if ((i - 1) * (i - 1) == N) {
ans--;
}
cout << ans * 2;
}
点个免费的赞吧!