您的位置:首页 > 其它

BZOJ3492: PA2012 Binary Dodgeball

2016-05-18 12:43 211 查看
感谢YJQ和visitWorld两位打野..

画个图发现是个Nim游戏

然后发现是个数位DP..

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

#define ll long long
ll DP[51][4][81][2];

ll check(ll max)
{
ll base=1ll<<49;
memset(DP,0,sizeof(DP));
DP[0][0][0][1]=1;
for(int i=1;i<=50;i++,base>>=1)
for(int k=0;k<=63;k++)
{
if(i==48&&k==2)
i++,i--;
if(base&max)DP[i][3][k][1]=DP[i-1][3][k][1]+DP[i-1][1][k][1];
else
DP[i][2][k][1]=DP[i-1][3][k^(50-i)][1]+DP[i-1][1][k^(50-i)][1];
if(base&max)
DP[i][1][k][1]=DP[i-1][0][k^(50-i)][1]+DP[i-1][2][k^(50-i)][1];
else DP[i][0][k][1]=DP[i-1][0][k][1]+DP[i-1][2][k][1];

DP[i][3][k][0]=DP[i-1][3][k][0]+DP[i-1][1][k][0];
DP[i][1][k][0]=DP[i-1][2][k^(50-i)][0]+DP[i-1][0][k^(50-i)][0];

DP[i][2][k][0]=DP[i-1][1][k^(50-i)][0]+DP[i-1][3][k^(50-i)][0]+
((base&max)?DP[i-1][1][k^(50-i)][1]+DP[i-1][3][k^(50-i)][1]:0);
DP[i][0][k][0]=DP[i-1][2][k][0]+DP[i-1][0][k][0]+
((base&max)?DP[i-1][2][k][1]+DP[i-1][0][k][1]:0);
}
int i=50;
return DP[i][0][0][0]+DP[i][1][0][0]+DP[i][3][0][0]+DP[i][2][0][0]+
DP[i][0][0][1]+DP[i][1][0][1]+DP[i][3][0][1]+DP[i][2][0][1]-1;
}

int main()
{
ll k;
scanf("%lld",&k);
ll R=1ll<<48,T,Mid,L=1;
ll Ta=check(10);
while(L<R)
{
Mid=L+R>>1;
if((T=check(Mid))<k)L=Mid+1;
else R=Mid;
}
cout<<L<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: