首页 > 其他分享 >UVA1482 Playing With Stones 题目分析

UVA1482 Playing With Stones 题目分析

时间:2024-11-24 20:56:06浏览次数:9  
标签:Stones 题目 int UVA1482 long sg include SG Playing

UVA1482 Playing With Stones 题目分析

题目链接

分析题目性质

这是一道博弈论题目,没有比较明显的结论后我们一般采用打表 \(SG\) 函数,然后找规律。

思路

经过上述,我们不难得到打表 \(SG\) 的代码(由于原本要到 \(10^{18}\),但数组存不下,这里只能考虑取样调查):

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stdlib.h>
#define N 105
#define int long long
using namespace std;
int sg[114514],T,a[N],n;
bool vis[114514];
signed main(){
	sg[1] = 0;
	for (int i = 2;i <= 15;i ++) {
		memset(vis,0,sizeof vis);
		for (int j = 1;j * 2 <= i;j ++)
			vis[sg[i - j]] = 1;
		for (int j = 0;;j ++)
			if (!vis[j]) {
				sg[i] = j;
				break;
			}
		cout << sg[i] << ' ';
	}
	return 0;
}

程序的输出如下:

1 0 2 1 3 0 4 2 5 1 6 3 7 0

把 \(SG(1)=0\) 加进来就是在前面多了一个 \(0.\)

我们似乎发现了一些规律:

  • 对于 \(x\) 为偶数,那么它的 \(SG(x)=\frac{x}2.\)

把偶数项删掉,得到:

0 1 0 2 1 3 0

我们发现这和原来的 \(SG\) 前 \(\frac{len}{2}\) 个是一样的(假设 \(len\) 为原本长度)。

于是又得到了:

  • 当 \(x\) 为奇数时,那么它的 \(SG(x)=SG(\lfloor\frac{x}{2}\rfloor).\)

这个过程的时间复杂度为 \(\mathcal{O}(\log x)\) 的。

那么我们不难用以下程序实现,时间复杂度 \(\mathcal{O}(n\log a_i)\):

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stdlib.h>
#define N 105
#define int long long
using namespace std;
int T,n;
int sg(int x) {
	if (x & 1) return sg(x / 2);
	else return x / 2;
}
signed main(){
	cin >> T;
	for (;T--;) {
		cin >> n;
		int v = 0;
		for (int i = 1,x;i <= n;i ++) {
			cin >> x;
			v ^= sg(x);
		} 
		if (v) puts("YES");
		else puts("NO");
	}
	return 0;
}

标签:Stones,题目,int,UVA1482,long,sg,include,SG,Playing
From: https://www.cnblogs.com/high-sky/p/18566343

相关文章

  • CF305E Playing with String
    难点在于读题发现\(l\)总取\(1\)即可,然后稍加转换就变成个傻逼题了有个显而易见的\(O(n^3)\)的区间DP做法,即考虑记录每个区间的SG函数值,然后枚举分界点转移但仔细思考我们会发现能进行操作的只有初始时\(s_{i-1}=s_{i+1}\)的位置,并不会经过某些操作后使得一个本来不......
  • 2024牛客2I Red Playing Cards
    本文同步于我的博客。ProblemThereare\(2\cdotn\)cardsarrangedinarow,witheachcardnumberedfrom\(1\)to\(n\)havingexactly2copies.Eachtime,Redcanchooseasubarrayofconsecutivecards(atleast\(2\)cards)toremovefromthedeck.The......
  • [CF1646F] Playing Around the Table 的题解
    题目大意有\(n\)种牌,一种\(n\)张,一共\(n\)个玩家,一人\(n\)个。每个人一次将一张牌对给下家,求构造方案使可以在\(n\cdot(n-1)\)次操作之内使第\(i\)个人拥有\(n\)张\(i\)。数据范围满足,\(1\len\le100\)。思路因为直接构造出题目要求的情况会出现如果一个人提......
  • [题解]AT_abc256_g [ABC256G] Black and White Stones
    思路容易看出来是个DP题,但是你发现DP的起点是不好确定的,于是假定第一条边的起点是黑色。然后你发现设为白色的贡献与黑色是相同的,于是直接令第一条边的起点是黑色,最后答案乘以\(2\)即可。然后就可以愉快的DP了。首先枚举每条边白色点的数量\(k\),定义\(dp_{i,0/1}\)......
  • CF1970F1 Playing Quidditch (Easy) 题解
    一道大模拟题。这道题可以用一个 map 记录球员及鬼飞球当时的坐标,用一个数组 a 记录是否有人进球,用另一个数组 b 记录每位球员是否有鬼飞球。当球员抓住鬼飞球后,鬼飞球跟着这个球员移动,直到这个球员投球。话不多说,直接上代码。MyCode:#include<bits/stdc++.h>#de......
  • CF965D Single-use Stones
    题目链接:因为青蛙最多跳\(l\)的距离,我们设\(l\)为一个区间,那么每个区间青蛙最多能跳过的只数,就是这个区间内石头的个数。(只要有一个区间青蛙没跳过去,那么整段就过不去了)因此青蛙能跳过去的最多只数就是所有区间长度为\(l\)的石头块数的最小值(确保无论踩在哪都能过河)#inclu......
  • 记一次dlopen使用问题导致Framework重启,tombstones、pmap与反汇编分析(上)
    关键词:AndroidFramework动态库动态链接Binder1、事件起因AndroidStudio一次更新后发现installApp,设备就重启了,跑了一遍开机动画但不是从开机第一屏开始重启,tombstones内容查看发现是surfaceflinger挂在libbinder.so,那installapp做了什么这个不得而知,理论上有问题应该挂的......
  • netty源码:(40)ReplayingDecoder
    ReplayingDecoder是ByteToMessageDecoder的子类,我们继承这个类时,也要实现decode方法,示例如下:packagecn.edu.tju;importio.netty.buffer.ByteBuf;importio.netty.channel.ChannelHandlerContext;importio.netty.handler.codec.ReplayingDecoder;importjava.nio.charset.C......
  • Displaying multiple columns in a HTML Listbox Control in ASP.Net
    REF:http://forums.aspfree.com/net-development-11/displaying-multiple-columns-in-a-html-listbos-control-in-asp-19062.html listboxcolumnspacingsolutionFINALLY!!!IKnowsomanypeoplehavehadthisproblem.Butfinallyisolveditwithyourbasicmonos......
  • 无涯教程-Clojure - Desktop – Displaying Labels函数
    可以在标签类的帮助下显示标签。以下程序显示了有关如何使用它的示例。(nsweb.core(:gen-class)(:require[seesaw.core:asseesaw]))(defn-main[&args](defndisplay[content](let[window(seesaw/frame:title"Example")](->win......