原题地址
这题总感觉在哪里见过…
直接搞式子:
(
l
+
r
)
(
r
−
l
+
1
)
2
=
n
(
l
+
r
)
(
r
−
l
+
1
)
=
2
n
设
a
=
(
l
+
r
)
,
b
=
(
r
−
l
+
1
)
则
a
b
=
2
n
a
+
b
=
l
+
r
+
r
−
l
+
1
=
2
r
+
1
所
以
a
+
b
为
奇
数
则
为
合
法
而
不
难
退
出
a
(
或
b
)
的
最
大
上
限
为
2
n
(
想
想
判
断
质
数
)
即
遍
历
一
个
因
数
,
然
后
跑
一
跑
判
断
既
珂
即
:
∑
i
=
1
2
n
i
+
(
2
n
i
)
m
o
d
2
=
=
1
∣
(
i
∣
2
n
)
\frac{(l+r)(r-l+1)}{2}=n\\ (l+r)(r-l+1)=2n\\ 设a=(l+r),b=(r-l+1)\\ 则ab=2n\\ a+b=l+r+r-l+1=2r+1\\ 所以a+b为奇数则为合法\\ 而不难退出a(或b)的最大上限为\sqrt{2n}(想想判断质数)\\ 即遍历一个因数,然后跑一跑判断既珂\\ 即:\\ \sum_{i=1}^{\sqrt{2n}} i+(\frac{2n}{i})mod2==1|(i|2n)
2(l+r)(r−l+1)=n(l+r)(r−l+1)=2n设a=(l+r),b=(r−l+1)则ab=2na+b=l+r+r−l+1=2r+1所以a+b为奇数则为合法而不难退出a(或b)的最大上限为2n(想想判断质数)即遍历一个因数,然后跑一跑判断既珂即:i=1∑2ni+(i2n)mod2==1∣(i∣2n)
谔谔
# include <bits/stdc++.h>
using namespace std;
long long n;
long long tot;
void solve(void)
{
tot=0;
for(long long i=1;i*i<=2*n;i++)
{
if(2*n%i!=0) continue ;
long long j=2*n/i;
if(!((i+j)&1)) continue;
tot++;
}
printf("%lld",tot);
return ;
}
int main(void)
{
scanf("%lld",&n);
solve();
return 0;
}
某神仙名言:奥利给,式子拆它就完了!