洛谷 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 
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;
}

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

你可能感兴趣的:(数论,题解)