Solution
赛事思路:
观察了一下100%的数据范围,
1
0
18
10^{18}
1018 很显然,如果按照题目描述做的话,只能拿部分分,所以我们考虑其他思路。
假设最初答案的位置在 1 1 1。那么如果执行的是操作 2 2 2 无论如何也无法改变答案,只有操作为 1 1 1 的时候可以改变。
如何改变答案呢?
由于删除操作是删除所有的奇数位,所以删除的数的个数肯定是 2 2 2 的 n n n 次方。进一步分析,由于每次删除的数的个数都是 2 2 2 的幂,所以第 i i i 次操作会使答案变为 a n s + 2 i − 1 ans+2^{i-1} ans+2i−1。
证明:
我们发现每次拿走的都是两个数中间的数,所以当前序列相邻两个数的差为
2
i
2^i
2i 其中
i
i
i 代表了当前操作的次数,由此可以发现,如果操作为
1
1
1 答案将变为
a
n
s
+
2
i
−
1
ans+2^{i-1}
ans+2i−1 而 如果操作为
2
2
2 则答案不变。
Code
#include<bits/stdc++.h>
using namespace std;
long long n,k,T,p,ans;
int main()
{
cin>>T;
while(T--)
{
ans=1;
cin>>n>>k;
for(long long i=1;i<=k;i++)
{
cin>>p;
if(p==1)
ans+=pow(2,i-1);
}
cout<<ans<<"\n";
}
return 0;
}
本题虽然有些巧妙,但总体难度不高,适合作T1