[SCOI2014]方伯伯打扑克
记录一下这道神仙题。全网都没有题解,顺便来发一篇。
大致题意:
有一个
10 分做法。
暴力模拟即可,没啥好讲的。
20 分做法。
考虑一下这个操作是在干嘛,咦,每个数减去
考虑直接写出操作后第
贴一下暴力代码:
#include<cmath>
#include<queue>
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const int MAXN=5e6+5;
LL m,n[MAXN],x[MAXN],L[MAXN],R[MAXN],TT[MAXN],Base,ans[MAXN],p,T;
void solve(int w){
int r=x[w]%n[w];
LL Ans=0,dr=1ll<<(n[w]-r),t=TT[w];
for(LL i=L[w]-1;i<=R[w]-1;i++)Ans^=(((i%dr)<<r)+(i/dr)+t+1);
ans[w]=Ans&((p>>1)-1);
}
signed main(){
scanf("%lld %lld %lld %lld %lld %lld %lld",&m,&n[0],&x[0],&L[0],&R[0],&TT[0],&Base);
p=1ll<<n[0];
solve(0);
for(int i=1;i<m;i++){
n[i]=(ans[i-1]+i-1)%5+Base;
p=1ll<<n[i];
L[i]=(ans[i-1]*2+L[i-1]+i-1)&(p-1);
L[i]++;
T=1ll<<(n[i]>>1);
R[i]=(ans[i-1]+1+(L[i]&(T-1))*T)&(p-1);
R[i]++;
if(L[i]>R[i])swap(L[i],R[i]);
x[i]=(R[i]-L[i]+TT[i-1]+i-1)&(p-1);
TT[i]=(L[i]+R[i])&(p-1);
solve(i);
}
printf("%lld\n",ans[m-1]);
return 0;
}
但是这个还是没啥用啊,照样
首先,把问题写成柿子:
相当于就是要求:
可能看到这个东西没啥想法,但没关系,我们来想一想跟异或有关的东西,
于是考虑怎么把这个柿子变成一段连续的值域,这个
后面这个不就是一段连续的值域?设
暴力算就可以得到
100 分做法。
还是回顾上面那个柿子:
左边较为复杂,先看右边,右边实际上是要解决这样子的一个子问题:
这个怎么做啊,反正都很大,还做个屁,数位 dp?显然不行,
先给出找规律的程序:
#include<cmath>
#include<queue>
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define int long long
LL f(LL n){
if(n%4==1)return 1;
else if(n%4==2)return n+1;
else if(n%4==3)return 0;
else return n;
}
signed main(){
int n,R,t,ans=0;
cin>>n>>R>>t;
for(LL i=0;i<=n;i++){
ans^=f(i*(1ll<<R)+t);
cout<<i<<" "<<ans<<endl;
}
return 0;
}
然后你会发现一些很 nb 的东西:
你会发现当
举个栗子:
输入
输出如下
0 1
1 1
2 0
3 0
4 1
5 1
6 0
7 0
你会发现
输入
输出如下
0 0
1 1
2 1
3 0
4 0
5 1
6 1
7 0
这次变成了
继续打:
输入
输出如下
0 1
1 1
2 0
3 0
4 1
5 1
6 0
7 0
你会发现这个循环节又回去了,于是猜测:对于当
证明啊,不会,找规律的精髓在于找到规律,而不是证明。
于是
这个有点复杂。
先随便打个表:
输入
输出如下
0 3
1 7
2 0
3 8
4 3
5 15
6 0
7 16
哎,有长度为
输入
输出如下
0 300000
1 98304
2 267232
3 131072
4 300000
5 229376
6 267232
7 786432
符合上面的结论,那哪些位置是没变的呢?
输入
输出如下
0 20
1 1024
2 3092
3 0
4 4116
5 1024
6 7188
7 0
可以发现这次不变的位置是
经过大量数据验证:不变的位置是
于是这个也可以做了,找到不变的两个位置,如果询问的位置
最后,这两个规律合并起来就可以
前面这个咋搞啊,发现
至此我们在
至于这些神仙规律怎么证明,我也不会,如果有哪位大佬会证明希望可以分享一下。
代码的话就不放出来了,要的可以私信我。