cf1451D. Circle Game (juego circular, matemáticas, resumen del juego)

Enlace de asunto: https://codeforces.ml/contest/1451/problem/D

El significado del título: A y U pueden jugar cualquier juego, el primer punto es (0,0). Ahora dé dos números enteros 1 <= d <= 1e5,1 <= k <= d. A va primero y k debe agregarse al eje horizontal o vertical cada vez. Y (x, y) debe satisfacer x * x + y * y <= d * d. Si una de las partes no puede ir, resulta estar perdida.

Solución del problema: problema de juego, problema de juego muy limpio. Al principio pensé que usaría la función sg o algo así, pero no sé cómo usar emmm. Casi ignorado que cf se centra en el pensamiento.

Aquellos que pueden tocar el medidor pueden tocar directamente el medidor y luego analizar la ley. (x + y)% 2 == 1 es A, (x + y)% 2 == 0 es U. Ahora juega la mesa con 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|||

Analice el límite, de arriba a abajo U, A, U, A, U, U, U, A, U, A, U. Hay más U, así que U debe ganar. (Es broma jaja).

Originalmente, quería escribir código directamente cuando presioné aquí. Por ejemplo, aquí p = 7. Es decir, cuando no hay un estado sucesor cuando (7,7), entonces U gana. Pero la idea no está clara, y el código para realizar esta función no se ha mecanografiado (me di por vencido sin ajustarlo después de que lo escribí. La decisión todavía es de pensar, de lo contrario es inútil, todavía no entiendo, y hay una alta probabilidad de WA. De todos modos, todavía hay mucho tiempo. Adiviné de nuevo en los últimos minutos. Así que lo pensé por otra media hora (Caiji tenía miedo de explicarlo) y finalmente esperé el momento en que su pensamiento estaba claro).

. . . . . . Derive el estado de A debe ganar y debe defender.

La idea final: (x, y), x == y debe ser U, si toma la x más grande, (x, y) no tiene un estado sucesor, U ganará, porque primero A a (1, 2) ((2, 1) Lo mismo por simetría), luego U (2,2), y luego no importa cómo vaya A, U siempre puede alcanzar (x, y) x == y. Entonces U gana.

Si (x, y), x == y y (x, y) tiene un estado sucesor. Luego A va a (1,2) primero, y luego no importa cómo vaya U, A puede ir directamente a un punto en una línea de A que está al lado del eje de simetría U (es decir, x, x + 1), entonces A gana. Debo decir que es muy inteligente.

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

para resumir:

1. Problema del juego: Piense si una persona puede llevar el juego a un cierto estado (este estado es bueno para uno mismo). Esta es la forma más común de pensar sobre los problemas del pensamiento de juegos. Antes no miraba la teoría de juegos. ¿Cómo puedo pensar en SG después de leer la teoría de juegos? ? ? En mi opinión, la prueba de FQ generalmente no es tan difícil.

 

Código:

#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:::

*/

 

Supongo que te gusta

Origin blog.csdn.net/I_have_a_world/article/details/109919534
Recomendado
Clasificación