P10765 题解
题目大意
有一个
分析
看到数据范围为
首先我们要明白最后得出的数字到底在哪个位置。
我们可以举几个例子
1 2 3 4 5 6 7 8
(1)1 3 5 7
(2)1 5
(3)1
1 2 3 4 5 6 7
(1)1 3 5 7
(2)1 5
(3)1
1 2 3 4 5 6 7 8 9 10 11
(1)1 3 5 7 9 11
(2)1 5 9 11
(3)1 9
(4)1
这些得数有什么共同点吗?
-
他们都只进行了
2 操作。 -
他们得数都为
1 。 -
每进行一次
2 操作,相邻两数间的差值就会变大,且每次变大后的差值为变化前相邻两数差值的2 倍。
即第
那为什么他们的结果都为 1 呢?
我们可以思考一下:
1 2 3 4 5 6 7
(1)2 4 6
(2)2 6
(3)2
1 2 3 4 5 6 7 8
(1)2 4 6 8
(2)4 8
(3)4
貌似看不出什么共同点,但我们可以联系上面的 2 操作。
我们发现,尽管
那第二个数要如何求得呢?
这时候我们就用到了操作
而且
综上所述,
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long//10^18一定要开long long
int main(){
int t;
cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
ll first=1;//first为第一个位置上的数,也就是本题的答案
ll cnt=1;//cnt为相邻两数的差值,一开始为1
for(int i=1;i<=k;i++){
int x;
cin>>x;
if(x==1){
first+=cnt;//执行1操作后第一个数变为第二个数,也就是原firt加上差值
cnt*=2;//重新更新两数差值
}
if(x==2)
cnt*=2;//只需要更新两数的差值
}
cout<<first<<endl;//第一个位置的数一定是最后一个数,也就是答案
}
return 0;//完结撒花!
}