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