HDU - 1525 Euclid's Game(打表)

本文探讨了一个数学博弈问题,通过分析给出了一种简单的先手胜利判断方法。当两个正整数n和m进行操作,较大数减去较小数的整数倍直至某数为0,先手是否能获胜取决于特定的数学条件。文章揭示了当n大于m且m小于等于n除以(1+根号5)乘以2时,先手获胜;反之,后手获胜。此规律源于表格数据的观察与OEIS数据库的验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:题目给出了两个正整数n,m
每次操作,大的数减掉小的数的整数倍。一个数变为0 的时候结束。
谁先先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。

看了一下网上的博客全是while循环判断的,但是这题其实就只要一个公式就可以了,
假设 n>m 如果m <= n / (1 + sqrt(5)) * 2 就是先手赢,否则后手赢,n==m时特判。

规律是打表+oeis找到的。
注释部分即为打表代码。

#include <bits/stdc++.h>
using namespace std;

#define sz(a) a.size()
#define all(x) (x).begin(), (x).end()
#define foo(i, s, e) for(int i=(s);i<=(e);i++)
#define fod(i, s, e) for(int i=(e);i>=(s);i--)
#define endl '\n'
#define debug(a) cout<<#a<<": "<<a<<'\n'
#define mod(x) (((x)%MOD+MOD)%MOD)
#define mem(a) memset((a),0,sizeof(a))
typedef long long ll;
typedef unsigned long long ull;

const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int maxn = 2e5 + 7;

int sg[1005][1005];
int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
//    mem(sg); for(int i = 1; i <= 200; i++) sg[i][1] = 1;
//    for(int i = 1; i <= 200; i++) {
//        for(int j = 1; j <= i; j++) {
//            if(i % j == 0) sg[i][j] = 1;
//            if(sg[i][j] == 0) {
//                for(int k = i + j; k <= 200; k += j)
//                    sg[k][j] = 1;
//                for(int k = i + j; k <= 200; k += i) sg[k][i] = 1;
//            }
//        }
//    }
//    for(int i = 1; i <= 200; i++) {
//        int maxx = 0;
//        for(int j = 1; j < i; j++) {
//            if(sg[i][j])
//                maxx = j;
//        }
//        cout << ' ' << maxx;
//    }

    int n, m;
    while(cin >> n >> m) {
        if(!n) break; if(n < m) swap(n, m);
        if(n == m) {
            cout << "Stan wins" << endl;
            continue;
        }
        if(m <= n / (1 + sqrt(5)) * 2) cout << "Stan wins" << endl;
        else  cout << "Ollie wins" << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值