P8177 「EZEC-11」等差数列
TernaryTree · · 题解
题目大意
给定一个长为
每次操作可选取
新加入的数也可以被选择。
求最多能进行的操作数。
思路分析
我们把
现在假设有等差数列
发现
所以当公差为奇数的时候,相邻两个数之间是无法进行操作的。
同时发现
扩展到任意等差数列:
所以我们是无法选取在
再来看一组数据:
首先,我们一段一段看。即分为
-
n=5,a=2,d=2 -
n=9,a=2,d=1
易发现
而
其实就是求
k = 1;
while (d % 2 == 0) {
d /= 2;
k *= 2;
}
k--;
当然,学过树状数组的童鞋可能会知道 lowbit 这个东东,所以就可以
k = (d & (-d)) - 1;
当然这个位运算的背后原理比较复杂,这里简单提一下,有兴趣的同学可以上网了解一下。
这里的
完整代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int c;
int n, a, d;
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(int X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
signed main() {
c = read();
while (c--) {
n = read(), a = read(), d = read();
write(((d & (-d)) - 1) * (n - 1));
puts("");
}
return 0;
}
为了抢一个最优解,附上了快读。不过最后还是没抢到