Luogu8177 solution

Problem

link->https://www.luogu.com.cn/problem/P8177

Solution

引理:\(a_i\)\(a_i+d\) 之间可以添加 \(2^{\max\{k|d\mod{2^k}=0\}}-1\) 个数。

证明:

  • 数学归纳法。

  • \(d\) 为奇数时,\(a_i+a_i+d\equiv2a_i+d\) 为奇数,无法添加,满足条件。

  • \(d=2\) 时可以添加一个。\(a_i+a_i+2=2a_i+2\) 为偶数,\(\frac{2a_i+2}{2}=a_i+1\neq a_i\neq a_i+2\),满足条件。

  • \(d\le k\) 满足条件,则将 \(d\cdot x\)。当 \(x\) 为奇数时,\(a_i+a_i+xd=2a_i+xd\)。若 \(d\) 为奇数,则上式亦为奇数无法添加。若 \(d\) 为偶数,则上式为偶数,可以添加 \(\frac{2a_i+xd}{2}=a_i+\frac{d}{2}x\)\(a_i\)\(a_i+\frac{d}{2}x\) 之间差为 \(\frac{d}{2}x\),可以继续添加 \(2^{\max\{k|\frac{d}{2}x\mod{2^k}=0\}}-1=2^{\max\{k|\frac{d}{2}\mod{2^k}=0\}}-1\) 个数;\(a_i+\frac{d}{2}x\)\(a_i+xd\) 之间差为 \(\frac{d}{2}x\),可以继续添加 \(2^{\max\{k|\frac{d}{2}x\mod{2^k}=0\}}-1=2^{\max\{k|\frac{d}{2}\mod{2^k}=0\}}-1\) 个数。两者相加再加上最初加的 \(a_i+\frac{d}{2}x\),答案为 \(2\cdot(2^{\max\{k|\frac{d}{2}\mod{2^k}=0\}}-1)+1=2^{\max\{k|d\mod{2^k}=0\}}-1\),满足条件。

  • \(d\le k\) 满足条件,则将 \(d\cdot 2\)\(a_i+a_i+2d=2a_i+2d\)。上式为偶数,可以添加 \(\frac{2a_i+2d}{2}=a_i+d\)\(a_i\)\(a_i+d\) 之间差为 \(d\),可以继续添加 \(2^{\max\{k|d\mod{2^k}=0\}}-1\) 个; \(a_i+d\)\(a_i+2d\) 之间差为 \(d\),可以继续添加 \(2^{\max\{k|d\mod{2^k}=0\}}-1\) 个;两者相加再加上最初加的 \(a_i+d\),答案为 \(2\cdot(2^{\max\{k|d\mod{2^k}=0\}}-1)+1=2^{\max\{k|2d\mod{2^k}=0\}}-1\),满足条件。

  • 证毕。

则对于每一个 \(a_i+(k-1)d\)\(a_i+kd\) 都可以添加一个 \(2^{\max\{k|d\mod{2^k}=0\}}-1\),而这样 \(k-1\ge1\)\(k\) 共有 \(n-1\) 个,故答案为 \((n-1)\cdot(2^{\max\{k|d\mod{2^k}=0\}}-1)\)

算法时间复杂度 \(\Theta(\log n)\)

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
	int T,n,a,d;
	scanf("%lld",&T);
	while(T--) {
		scanf("%lld%lld%lld",&n,&a,&d);
		int tot=1;
		while((d+1)&1)
			tot<<=1,d>>=1;
		printf("%lld\n",(n-1)*(tot-1));
	}
	return 1;
}
posted @ 2022-08-02 08:35  lsj2009  阅读(39)  评论(0)    收藏  举报