cf1451D. Circle Game(圆圈博弈、数学、博弈总结)

题目链接:https://codeforces.ml/contest/1451/problem/D

题意:A和U两个任玩游戏,最开始一个点在(0,0)。现在给定两个整数1<=d<=1e5,1<=k<=d。A先走,每次必须在横或者纵坐标上加上k。且(x,y)必须满足x*x+y*y<=d*d。如果一方不能走了则证明输了。

题解:博弈问题,很公平的博弈问题。开始以为要用到sg函数什么的,又不会emmm看来啥时候得去学一学了。差点忽略了cf以考查思维为主。

能打表的可以直接打表,然后分析规律。(x+y)%2==1为A,(x+y)%2==0为U。现在以k=1打表。

d=10:

10
  1|||U A U A U A U A U 
  2|||A U A U A U A U A 
  3|||U A U A U A U A U 
  4|||A U A U A U A U A 
  5|||U A U A U A U A   
  6|||A U A U A U A U   
  7|||U A U A U A U 
  8|||A U A U A U   
  9|||U A U A       
 10|||

分析边界,从上到下U,A,U,A,U,U,U,A,U,A,U。U多一些所以U必胜。(开玩笑的哈哈)。

本来打到这里就想要直接写代码比如这里p=7.即到(7,7)的时候没有后继状态了,那么就一定U胜了。但是思路没有清晰,实现这个功能的代码也没有打出来(打了一下也没调就放弃了,决定还是思想,不然也没啥用,还是不懂,而且大概率WA,反正时间还多,大不了最后几分钟再猜。于是又思考了半小时(菜鸡畏难不解释)终于等来了思路明晰的那一刻)。

。。。。。。推导A的必胜,必败状态。

最后思路:(x,y),x==y时一定为U,如果取最大的x,(x,y)没有后继状态的话一定U胜,因为首先A到(1,2)((2,1)一样的因为对称),然后U(2,2),然后不管A怎么走,U总能总到(x,y)x==y。所以U胜。

如果(x,y),x==y且(x,y)有后继状态。那么A先到(1,2),然后无论U怎么走,A都能直接到挨着对称轴U的一条全为A的线上的点(即x,x+1),所以A胜。不得不说很巧妙啊。

###########################################################

总结:

1.博弈问题:思考一个人是否能将博弈拉到某个特定状态(这个状态有利于自己)。这是最常见的博弈思维题的思维方式了,之前没看博弈论都是这样干的,怎么看了博弈论之后就,看到博弈题目就往sg上想了???我认为,cf一般不会考到那么的难。

代码:

#include <bits/stdc++.h>

#define ll long long
#define ld double
#define pi acos(-1)
#define pb push_back
#define mst(a, i) memset(a, i, sizeof(a))
#define pll pair<ll, ll>
#define fi first
#define se second
#define mp(x,y) make_pair(x,y)
#define rep(i,a,n)  for(ll i=a;i<=n;i++)
#define per(i,n,a)  for(ll i=n;i>=a;i--)
#define dbg(x) cout << #x << "===" << x << endl
#define dbgg(l,r,x) for(ll i=l;i<=r;i++) cout<<x[i]<<" ";cout<<endl
using namespace std;

template<class T>void read(T &x){T res=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){res=(res<<3)+(res<<1)+c-'0';c=getchar();}x=res*f;}
inline void print(ll x){if(x<0){putchar('-');x=-x;}if(x>9)print(x/10);putchar(x%10+'0');}
const ll maxn = 1e5 + 10;
const ll mod = 1e9+7;

ll d,k;
//ll inv(ll a){return a==1?1:(ll)(mod-mod/a)*inv(mod%a)%mod;}
//ll gcd(ll a,ll b){return (b==0)?a:gcd(b,a%b);}
//ll qpow(ll a,ll p,ll mod){ll ans=1;a=a%mod;while(p){if(p&1)ans=(ans*a)%mod;p>>=1;a=(a*a)%mod;}return ans;}
int main() {
    ll _s = 1;
    read(_s);
    //freopen("testdata.in","r",stdin);
	//freopen("testout.out","w",stdout);
    for (ll _=1;_<=_s;_++) {
        read(d),read(k);
		ll p=1;
		for(ll i=1;;i++){
			if((i*k)*(i*k)+(i*k)*(i*k)>d*d){
				p=i;break;
			}
		}
		--p;
		// dbg(p);
		bool f=true;
		ll t=p*p*k*k+k*k*(p+1)*(p+1);
		// dbg(t);
		if(t<=d*d) f=true;
		else f=false;
		puts(f?"Ashish":"Utkarsh");
    }
    return 0;
}
/*
input:::
Utkarsh
Ashish
Utkarsh
Utkarsh
Ashish

output:::

*/

猜你喜欢

转载自blog.csdn.net/I_have_a_world/article/details/109919534