传送门: https://atcoder.jp/contests/abc190/tasks/abc190_d
题意
给 一 个 N , 问 有 多 少 种 等 差 数 列 ( 公 差 为 1 ) 的 和 等 于 N , 输 出 个 数 。 给一个N,问有多少种等差数列(公差为1)的和等于N,输出个数。 给一个N,问有多少种等差数列(公差为1)的和等于N,输出个数。
思路
假
设
我
们
选
择
的
等
差
数
列
为
[
a
,
b
]
,
则
根
据
题
意
可
以
得
到
假设我们选择的等差数列为[a,b],则根据题意可以得到
假设我们选择的等差数列为[a,b],则根据题意可以得到
(
b
+
a
)
(
b
−
a
+
1
)
2
=
N
\frac{(b+a)(b-a+1)}{2}=N
2(b+a)(b−a+1)=N
(
b
+
a
)
(
b
−
a
+
1
)
=
2
N
(b+a)(b-a + 1)=2N
(b+a)(b−a+1)=2N
不
管
a
和
b
的
奇
偶
性
。
都
可
以
得
到
(
b
+
a
)
和
(
b
−
a
+
1
)
一
定
是
一
奇
一
偶
。
不管a和b的奇偶性。都可以得到(b+a)和(b-a+1)一定是一奇一偶。
不管a和b的奇偶性。都可以得到(b+a)和(b−a+1)一定是一奇一偶。
所
以
我
们
只
用
求
出
2
∗
N
的
奇
数
因
子
个
数
,
用
算
数
基
本
定
理
求
。
所以我们只用求出2*N的奇数因子个数,用算数基本定理求。
所以我们只用求出2∗N的奇数因子个数,用算数基本定理求。
由
于
是
奇
数
,
所
以
2
的
因
子
就
不
用
了
,
所
以
直
接
求
N
的
奇
数
因
子
个
数
。
由于是奇数,所以2的因子就不用了,所以直接求N的奇数因子个数。
由于是奇数,所以2的因子就不用了,所以直接求N的奇数因子个数。
注 意 : 任 何 一 组 解 都 能 在 左 边 加 上 一 正 一 负 给 抵 消 掉 , 所 以 最 后 结 果 ∗ 2. 注意:任何一组解都能在左边加上一正一负给抵消掉,所以最后结果*2. 注意:任何一组解都能在左边加上一正一负给抵消掉,所以最后结果∗2.
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
ll get_Count(ll n) {
ll ans = 1;
for(ll i = 2;i * i <= n; i++) {
if(n % i == 0) {
int a = 0;
while(n % i == 0) {
a++;
n /= i;
}
if(i != 2)
ans *= (a + 1);
}
}
if(n > 1) ans *= 2;
return ans;
}
void solve() {
ll n; cin >> n;
cout << get_Count(n) * 2 << endl;
}
signed main() {
solve();
}