首页 > 其他分享 >SP20848 IGAME - Interesting Game 题解

SP20848 IGAME - Interesting Game 题解

时间:2024-03-07 13:34:34浏览次数:38  
标签:SP20848 le int 题解 sum 必赢 Interesting oplus now

分析

数位 DP 一眼题。

对于一个 \(k\) 位的数 \(s\),我们不妨将其看做由数字 \(s_1,s_2,s_3,\dots,s_k\) 这 \(k\) 个数字拼接起来的。而题意是每个人可以将 \(s_1,s_2,s_3,\dots,s_k\) 中的任意一个减去任意数字,保证不减去 \(0\) 且结果 \(\ge 0\)。显然,在我们将这 \(k\) 个数看成 \(k\) 堆石头之后,这就是一个取石子游戏。根据博弈结论,若 \(s_1\oplus s_2 \oplus s_3 \oplus \dots \oplus s_k=0\),则后手存在必胜策略,反之先手存在必胜策略。

对于该题,我们可以用数位 DP 求出区间 \(l,r\) 中各位异或之后结果为 \(0\) 的个数,也就是小 B 必赢的数的个数。而在所有数中,不是小 B 必赢就是小 A 必赢,所以该区间剩下的数的个数就是小 A 必赢的数量。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,l,r;
int a[20],len;
int f[20][50];
int dfs(int now,int if_le,int sum){
	if(!now){
		return !sum;
	}
	else if(f[now][sum]!=-1&&!if_le){
		return f[now][sum];
	}
	else{
		int ans=0,up=if_le?a[now]:9;
		for(int i=0;i<=up;i++){
			ans+=dfs(now-1,if_le&&i==up,sum^i);
		}
		return if_le?ans:f[now][sum]=ans;
	}
}
int check(int x){
	len=0,memset(f,-1,sizeof(f));
	while(x){
		a[++len]=x%10,x/=10;
	}
	return dfs(len,1,0);
}
signed main(){
	cin>>t;
	while(t--){
		cin>>l>>r;
		int ans=check(r)-check(l-1);
		cout<<(r-l+1-ans)<<" "<<ans<<"\n";
	}
	return 0;
}

标签:SP20848,le,int,题解,sum,必赢,Interesting,oplus,now
From: https://www.cnblogs.com/harmisyz/p/18058696

相关文章

  • AT_abc216_g [ABC216G] 01Sequence 题解
    分析一道差分约束题。我们令\(\mathit{sum}_{i}\)表示\(1\)到\(i\)中,\(1\)的数量,根据题意可得:\(\mathit{sum}_{l_i-1}+x_i\le\mathit{sum}_{r_i}\)\(\mathit{sum}_{l+1}+(-1)\le\mathit{sum}_{l}\)\(\mathit{sum}_{l}+0\le\mathit{sum}_{l+1}\)因为我们要尽......
  • CF1066E 题解
    Solution首先不难想到计算\(a\)的每一位对答案产生的贡献,然后题目告诉我们\(b\)每次会往右移一位,然后结合样例可以发现:对于\(a\)的第\(i\)位,能与其产生贡献的条件是:\(a_i=1\)且\(b_j=1(i\leqj)\),对答案的贡献不难想出即为\(2^{i-1}\times\sum\limits_{j=i}^{m}b_j......
  • AT_abl_e Replace Digits 题解
    分析线段树模板题。维护一个区间\([l,r]\)中\(\sum\limits_{i=l}^r10^{n-i}\)的答案。将某个区间\([l,r]\)全部修改成\(x\)之后的表示的数就是\(x\times(\sum\limits_{i=l}^r10^{n-i})\)。区间修改可以用线段树,用快速幂或者预处理弄出来\(10^x\),建树的时候就能把每......
  • AT_abl_d Flat Subsequence 题解
    分析线段树模板题。一眼DP。定义状态函数\(\mathit{f}_i\)表示前\(i\)个数中,必选\(\mathit{A}_i\)时\(B\)的最大长度。则有转移方程:\(\mathit{f}_i=\max\{f_j|((1\lej\lei-1)\land(-k\leA_i-A_j\lek))\}+1\)。答案就是\(\max\limits_{i=1}^{n}\mathit{f}_i......
  • CF808E 题解
    很好的一道分类讨论题。观察数据范围,\(w\leq3\),不难想到,将\(w\)分为\(1,2,3\)种情况,如果直接贪心选会不难发现是错的。但是如果\(w\)的值只有\(2\)种,就像\(w=1/2\)的情况,将\(w=1/2\)的数据按价值排序,最后枚举每种选多少即可。但是\(w=3\)就会显得难以处理,需要讨......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    分析按照\(k\)的奇偶分开考虑。\(k\)为奇数。一个好的节点有且仅有一个在任意两个有人的节点\(i,j\)的路径的交点上的最优位置。若该交点偏移\(1\)步,则必然会使路径长度和\(+1\)。故期望为\(1\)。\(k\)为偶数。任意一个好的节点仍然在任意两个有人的节点\(i,j\)的......
  • 【教程】HBuilderX开发实践:隐私合规检测问题解决方案
    文章目录摘要引言正文1、违规收集个人信息2、APP强制、频繁、过度索取权限知识点补充总结 摘要本篇博客介绍了在使用HBuilderX进行开发过程中,常遇到的隐私合规问题,并提供了相应的解决方案。主要包括违规收集个人信息和APP强制、频繁、过度索取权限两方面。......
  • CF147B 题解
    Solution一道十分典型的dp题。有三个关键点分别是定义状态、优化和答案的统计。首先定义状态,定义\(f_{i,j,p}\)表示\(i\toj\)号节点,共走了不超过\(p\)条边,且是\(i\toj\)的最长路径。不超过\(p\)条边是为了方便转移,而最长路径如果都为负环,说明需要走更多的边,实......
  • P1503 鬼子进村 题解
    分析分块。我们定义\(\mathit{cnt}_i\)表示房子\(i\)是否出现过,\(\mathit{sum}_i\)表示在第\(i\)个块内没有被摧毁的房子数量,维护的房子是\((i-1)\timesS-1\)到\(i\timesS\),其中\(S=\sqrt{n}\)也就是块长。操作\(1\)。写一个栈,根据后进先出的特点,讲摧毁的房子......
  • ARC090E 题解
    Solution一道不错的计数题。因为直接求不相遇的方案十分复杂,所以考虑正难则反,用总的方案数减去相遇的方案数。求方案数很套路:在求最短路的时候开一个数组\(del\)记录到达点\(i\)的最短路条数,更新最短路时顺便更新即可。跑完最短路后,设\(dis1\)为\(s\)到\(t\)的最短路......