洛谷 P6267 [SHOI2002]N的连续数拆分

原题地址

这题总感觉在哪里见过…
直接搞式子:
( 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)(rl+1)=n(l+r)(rl+1)=2na=(l+r),b=(rl+1)ab=2na+b=l+r+rl+1=2r+1a+b退a(b)2n i=12n i+(i2n)mod2==1(i2n)
谔谔

# 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;
}

某神仙名言:奥利给,式子拆它就完了!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值