首页 > 其他分享 >luogu P3518 [POI2011]SEJ-Strongbox | loj #2160. 「POI2011 R2 Day0」保险箱 Strongbox

luogu P3518 [POI2011]SEJ-Strongbox | loj #2160. 「POI2011 R2 Day0」保险箱 Strongbox

时间:2023-01-13 00:45:05浏览次数:55  
标签:Strongbox 群里 gcd R2 int POI2011 vec

代码已在 loj 上不开 O2 通过。

下文均在 \(Z_n\) 下考虑。

首先,你考虑选出一些数,能组成的数。即 ttps://www.cnblogs.com/xugangfan/p/17040634.html

那么对于一个不在群里的数 \(x\),若有 \(d\),满足 \(d|x\),则 \(d\) 显然不在群里。又因为在 \(Z_n\) 下,所以 \(\gcd(d,n)\) 也不在群里。

接着,你考虑答案是若干个数以及 \(n\) 的线性组合,这些数的 \(\gcd|n\),因此,考虑确定他们的 \(\gcd\) 这样我们就确定了可选的数以及生成的群 \(\langle \gcd\rangle\)。又因为你要让群的元素数量最大,根据 \(\langle d\rangle=n/d,d|x\),我需要让 \(\gcd\) 最小,那么能够选择的元素即为 \(\sum_i [\gcd|i]\)。

考虑枚举这个 \(\gcd\),那么对 \(n\) 分解因数可得到,然后你需要满足 \(\gcd | a_k\),且 \(\forall i\in [1,k-1],\gcd \not | a_i\),注意前者是可以直接干掉的,后者可以对 \(n\) 进行质因数分解,然后 \(\forall i\in [1,k-1]\) 都与 \(n\) 取 \(\gcd\),然后变成了一个高维后缀 or,你直接做就是对的,hash 一下用 map 存即可。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=(int)(3e5+5),mod=998244353;
mt19937 RAND(time(0));
const int base=RAND()%mod;
map<int,bool>mp;
int n,k,a[N],vec[N],tot,o[N],ct,v[100],mxv[100],ID;

int gcd(int x,int y) {
	return !y?x:gcd(y,x%y);
}

void add() {
	int res=0;
	for(int i=1;i<=ct;i++) res=(res*base%mod+v[i])%mod;
	res=(res%mod+mod)%mod;
	mp[res]=1;
}

void dfs(int st) {
//	cout<<st<<'\n';
	if(st==ct+1) {
		int res=0;
		for(int i=1;i<=ct;i++) res=(res*base%mod+v[i])%mod;
		res=(res%mod+mod)%mod;
		int res2=0;
		for(int i=1;i<=ct;i++) {
			if(i==ID) res2=(res2*base%mod+(v[i]+1))%mod;
			else res2=(res2*base%mod+v[i])%mod;
//			cout<<v[i]<<' ';
		}
//		cout<<'\n';
		res2=(res2%mod+mod)%mod;
		mp[res]|=mp[res2];
		return ;
	}
	for(int i=mxv[st];i>=0;i--) {
		v[st]=i; dfs(st+1);
	}
}

void init() {
	int x=n;
	for(int i=2;i*i<=x;i++) {
		if(x%i) continue ;
		o[++ct]=i;
		while(x%i==0) x/=i,++mxv[ct];
	}
	if(x!=1) o[++ct]=x,mxv[ct]=1;
	for(int i=1;i<k;i++) {
		a[i]=gcd(a[i],n);
		x=a[i];
		for(int j=1;j<=ct;j++) {
			v[j]=0;
			if(x%o[j]) continue ;
//			int qwq=0;
			while(x%o[j]==0) v[j]++,x/=o[j];
		}
		add();
	}
	for(int i=1;i<=ct;i++) {
		ID=i; dfs(1);
	}
}

bool chk(int x) {
	for(int i=1;i<=ct;i++) {
		v[i]=0;
		if(x%o[i]) continue ;
		while(x%o[i]==0) v[i]++,x/=o[i];
	}
	int res=0;
	for(int i=1;i<=ct;i++) res=(res*base%mod+v[i])%mod;
	res=(res%mod+mod)%mod;
	return mp[res];
}

signed main() {
//	freopen("2.in","r",stdin);
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n>>k;
	for(int i=1;i<=k;i++) cin>>a[i];
	init();
	int D=n;
	int ans=0;
	if(!a[k]) {
		for(int i=1;i*i<=n;i++) {
			if(n%i) continue ;
			if(!chk(i)) {
				D=min(D,i);
				break ;
			}
			if(!chk(n/i)) vec[++tot]=n/i;
		}
		if(D==n) {
			for(int i=tot;i>=1;i--) {
				if(!chk(vec[i])) {
					D=min(D,vec[i]);
					break ;
				}
			}
		}
	} else {
		for(int i=1;i*i<=n;i++) {
			if(n%i) continue ;
//			int qwq=__gcd(n,a[k]);
			if(a[k]%i==0&&!chk(i)) {
				D=min(D,i);
				break ;
			}
//			qwq=__gcd(n,a[k]/i);
			if((a[k]%(n/i)==0)) vec[++tot]=n/i;
		}
		if(D==n) {
			for(int i=tot;i>=1;i--) {
				if(!chk(vec[i])) {
					D=min(D,vec[i]);
					break ;
				}
			}
		}
	}
	cout<<n/D;
	return 0;
}

标签:Strongbox,群里,gcd,R2,int,POI2011,vec
From: https://www.cnblogs.com/xugangfan/p/17048365.html

相关文章

  • Windows Server 2008 R2安装Sqlserver 2008的步骤和设置跨网远程访问SQL server​
    WindowsServer2008R2安装Sqlserver2008的步骤和设置跨网远程访问SQLserver最近学习sql数据库,所以捣鼓一下安装sqlserver数据库的教程;​安装SQLServer2008R2需要.NE......
  • Win10\Winser2019关闭驱动数字签名方法
    原帖:https://blog.csdn.net/inthat/article/details/124969099方案一:临时禁用驱动数字签名强制,方法:https://jingyan.baidu.com/article/624e74594dbc8d34e8ba5aa6.html通......
  • 【记录】自我批判ver2023-1-10
    1.你认为的社会是怎么样的,那么,你对社会的这个怎么样是促进了还是阻碍了。如果你认为社会是险恶的,那么,你是增进了社会的险恶还是让社会不再更加险恶?如果你认为社会是美好......
  • SQL Server 2008 R2 使用 PIVOT 错误
    SQLServer2008R2使用PIVOT错误!'PIVOT'附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值,以启用此功能。有关ALTERDATABASE的SETCOMPATIBILITY_L......
  • hws_winter2022-re
    一.Babyre程序入口处调用了一个check函数,但这个是假的检验跟进去发现做了一些简单操作,尝试了几次但逆不出来,就到别的文件里看了看,结果发现还有一段解密 读取了enc文......
  • SQL SERVER2016 4亿条数据秒查的实现
    第一步装机:内存16个128G,intel固态一个,CPU两个48核第二步装系统:直接win10,正版或者got版本都行,稳定就好第三步骤装SQL2016+管理工具://服务端下载地址:ed2k://|file|cn_sql_se......
  • AtCoder284 D - Happy New Year 2023
    AtCoder284D-HappyNewYear2023[Editorial](Editorial-AtCoderBeginnerContest284)Youaregivenapositiveinteger\(N\).Itisknownthat\(N\)canbe......
  • CVPR2023审稿的经验和想法
    今年CVPR邀请我审稿,共审了4篇。拿到一篇稿子,第一遍,我首先粗略看一下这篇论文的motivation(有时候是assumption)是否牢靠;模型的技术创新怎么样;模型性能怎么样。如果......
  • SpringBoot——Swagger2的集成和使用
    前言现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的沟通成本就增加了。所以一款强大的RESTfulAPI文档就至关重要了。而目前在后端领域,基本......
  • P3527 [POI2011]MET-Meteors
    题目之前学完整体二分就一直准备做来着,结果一直到今天才做对,所以我还是太菜辣!整体二分说白了就是将多次二分放在一起一次处理,也并不是简简单单的查询第$K$大,所以有些题......