首页 > 其他分享 >题解 ARC155D Avoid Coprime Game

题解 ARC155D Avoid Coprime Game

时间:2023-02-04 21:13:22浏览次数:49  
标签:int 题解 Avoid mu maxn Coprime include SG

题解 ARC155D Avoid Coprime Game

题意

给定一个可重集 \(S\) ,保证 \(\gcd_{x\in S}(x)=1\) ,维护一个初始为 \(0\) 的整数 \(G\) ,双方轮流操作,每次每人选择 \(S\) 中一个数 \(x\) 满足 \(\gcd(x,G)\ne 1\) ,然后 \(G\gets \gcd(x,G)\) 同时将 \(x\) 从 \(S\) 中删去,谁无法操作谁败。

对于所有 \(x\in S\) ,询问若先手一开始选择 \(x\) 则谁会获胜。

值域 \(2\times 10^5\) ,集合大小 \(2\times 10^5\) 。

题解

分析

考虑一个局面 \((G',S')\) ,如果这个局面可以到达,那么显然 \(S\) 中所有不被 \(G'\) 整除的数 \(x\) 都必须在 \(S'\) 中,考虑哪些被 \(G'\) 整除的数 \(y\) ,如果之后的某次操作选择了 \(y\) ,那么 \(G'\) 显然不会变,所以实际上这些数对局面的影响本质是等效的,如果有 \(k\) 个这样的数,将这 \(k\) 个数从 \(S'\) 中删去得到 \(S''\) ,用局面 \((G',S'',k)\) 表示,那么后面的每次决策要么就是同时改变 \(G',S''\) ,要么就是 \(k\gets k-1\) ,所以本质上就是这两个游戏的组合,而 \(k\) 每次减一这个游戏的 SG 函数值显然就是 \(k\) 的奇偶性,所以可以得到 \(SG(G',S')=SG(G',S'')\oplus(k\&1)\) ,而值得注意的是, \(S''\) 仅由 \(G'\) 唯一确定( \(S''\) 就是 \(S\) 中所有不能被 \(G'\) 整除的数),不妨记 \(S''=F(G')\) 。

于是你可以把所有可到达局面简化成 \((G',F(G'))\) ,而 \(G'\) 就是值域范围,所以局面就被简化为可接受的数量了,接下来就是求所有的 \(SG(G',F(G'))\) 了,局面连边数是 \(A\log A\) 级别的,暴力连边即可,这个就是看 \(F(G')\) 与 \(G'\) 的 \(\gcd\) 可能为哪些了,用莫反很好处理。(感觉没有啥更简单的方法了。。。)

总复杂度 \(O(A\log^2 A)\) 。

参考代码

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=200005;
int A[maxn],CNT[maxn],sg[maxn];
int vis[maxn],mu[maxn],pri[maxn],cnt;
int sb[maxn];
std::vector<int>fk[maxn],kf[maxn];
int main(){
	int N;scanf("%d",&N);
	for(int i=1;i<=N;++i)
		scanf("%d",&A[i]),++CNT[A[i]];
	vis[1]=true;mu[1]=1;
	for(int i=2;i<maxn;++i){
		if(!vis[i])mu[pri[++cnt]=i]=-1;
		for(int j=1;j<=cnt;++j){
			int k=i*pri[j];
			if(k>=maxn)break;
			vis[k]=true;
			if(i%pri[j]==0)break;
			mu[k]=mu[i]*mu[pri[j]];
		}
	}
	for(int i=1;i<=cnt;++i){
		for(int j=(maxn-1)/pri[i];j>=1;--j){
			CNT[j]+=CNT[j*pri[i]];
		}
	}
	for(int i=1;i<maxn;++i)
		for(int j=i;j<maxn;j+=i)
			fk[j].push_back(i);
	for(int i=1;i<maxn;++i){
		for(auto j:fk[i])if(j>1&&j<i){
			int az=0;
			for(auto k:fk[i/j]){
				az+=mu[k]*CNT[j*k];
			}
			if(az)kf[i].push_back(j);
		}
	}
	for(int i=2;i<maxn;++i){
		for(auto j:kf[i]){
			int o=sg[j];
			o^=(CNT[j]-CNT[i]-1)&1;
			sb[o]=true;
		}
		while(sb[sg[i]])++sg[i];
		for(auto j:fk[i]){
			int o=sg[j];
			o^=(CNT[j]-CNT[i]-1)&1;
			sb[o]=false;
		}
	}
	for(int i=1;i<=N;++i){
		int o=sg[A[i]];
		o^=((CNT[A[i]]-1)&1);
		puts(o?"Aoki":"Takahashi");
	}
	return 0;
}

标签:int,题解,Avoid,mu,maxn,Coprime,include,SG
From: https://www.cnblogs.com/lsq147/p/17092387.html

相关文章

  • circle 题解(思维+堆)
    题目有\(n\)个圆心在\(x\)轴上的不相交的圆(存在边界重合),求这些圆将平面分为几部分。保证\(1\leqn\leq3\times10^5\),\(-10^9\leqx_i,y_i\leq10^9\)。一个......
  • CF765F Souvenirs 题解
    Preface在会压位Trie的前提下,本题最好想的做法应该是压位Trie+回滚莫队,可是竟然没人写这个做法的题解?Solution我们先转化题意:设\(a_i\)在\([l,r]\)中的前驱后继......
  • PAT乙级题解
    1001害死人不偿命的(3n+1)猜想传送门知识点:简单模拟思路:判断奇偶,根据题意即可参考代码:点击查看代码#include<iostream>usingnamespacestd;intmain(){i......
  • 题解 G. Grammar Path 2020-2021 ICPC NERC (NEERC), North-Western Russia Regional
    传送门【大意】给定一个CNF和一个有向图。有向图上的每一条边都写上了一个字母。要求你从\(s\)到\(t\)走一条尽可能短的路,且将经过的字母写下来后,这个字符串能被......
  • [JOI 2021 Final] 地牢 3 题解
    做法学习自日语酱的题解/hs/bx。本文旨在讲述我个人看完题解对此题做法的理解,可以视作对日语酱题解的注解(?。本人很菜,很可能出错,请谅解qwq。首先,对样例进行模拟,得到......
  • 最小公倍佩尔数 题解
    首先需要知道\(f\)是个啥这里直接给出结论,过程可以看大佬的博客\(f(n)=2f(n-1)+f(n-2)\)\(f(0)=0\)\(f(1)=1\)这种类似斐波那契数列的递推式有结论\(gcd(......
  • P3119 [USACO15JAN]Grass Cownoisseur G 题解
    做过的原题,模拟赛时PDF里的题面实在有点难受。首先有显然结论:在一个环上反走一定是不值的,因为环上的点本来就相互可达。所以考虑缩点。缩点后的问题可以看成:求对于每一......
  • P8368 [LNOI2022] 串 题解
    题目链接题目分析题目要求我们构造一个最长的\(T\)序列,我们首先从每个\(T_i\)入手,思考如何安排才能合法。容易观察到对于每个\(T_i\),合法的\(T_{i-1}\)有两种方......
  • 【题解】P5219 无聊的水题 I
    思路prufer序列+卷积优化dp.首先考虑到令\(a\)为原树的prufer序列,则\(\sum\limits_{i=1}^{n-2}[a_i=k]=\operatorname{deg}(k)\),其中\(\operatorname......
  • IIS WordPress 单站点,多站点 中文URL乱码和重定向多次问题解决方法
    前提是需要安装IISURL重写组件(安装方法这里不说明,搜一下资料就有)1、站点网站根目录新增一个chineseurl.php文件用来处理中文url问题<?php//IISMod-Rewriteif(is......