BZOJ 2277 Poi2011 Strongbox
题目大意:一个集合A,包含了0~n-1这n个数。另有一个集合B,满足:
1.B是A的子集。
2.如果a、b均在B中,则(a+b)%n也在B中(a=b亦可)
给出k个数ai,前k-1个不在B中,第k个在B中,问B最大有几个元素。
数据范围:1<=k<=250000,k<=n<=1e14;
(以下x,y均代表互不相关的整数)
考虑集合B。
假设B中有一元素v。则方程 v*x-n*y=c(即v*x与c对n同余)当且仅当gcd(v,n)|c 时有正整数解x,y。
那么显然c=gcd(v,n)时方程有正整数解x,y。则v∈B->gcd(v,n)∈B……①
又因为方程 v*x+u*y=gcd(u,v)必有整数解x、y,所以根据B的特点2可得 u,v∈B->gcd(u,v)∈B……②
根据题意,(gcd(v,n)*x)%n也必在B中……③
由①、②,设B中所有数的最大公约数与n的最大公约数为g,则g必在B内且为B中最小正整数,又根据③,g,2*g,3*g,4*g……均在B中。有因为g是所有元素的最大公约数,所以B中不会再有别的元素。
以上,我们只要求出满足条件的最小g即可。g的限制条件如下:ai%g!=0,gcd(n,ak)%g==0。
最自然的想法是O(sqrt(gcd(n,ak)))枚举g再对于每个g进行O(k)检验,显然会T。然后……我就不会做了……
根据机智的题解,到这一步我们有以下两种做法:
一、
对于1<=n<=1e14,n最多有17280个因子,那么我们发现g最多有17280个。将所有gcd(n,ai)去重后,个数也会降到17280以下。这样效率就基本OK了。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int sz=25e4+;
ll k,a[sz],n,q;
int l,len;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
bool ck(ll v){
for(int i=;i<=l;i++)
if(a[i]%v==)return ;
return ;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i=;i<=k;i++){
scanf("%lld",&a[i]);
a[i]=gcd(a[i],n);
}
sort(a+,a+k);
for(int i=;i<k;i++)
if(a[i]!=a[i-])a[++l]=a[i];
for(ll j=;j*j<=a[k];j++)if(a[k]%j==0){
if(ck(j)){
printf("%lld",n/j);
return ;
}
if(ck(a[k]/j))q=a[k]/j;
}
printf("%lld",n/q);
return ;
}
二、
在某数学一本通上看到的,但是它的代码和说明蒟蒻我都没看懂,感兴趣的大佬可以看看这篇,貌似和某数学一本通一模一样,看懂的大佬好心的话来教教我。
BZOJ 2277 Poi2011 Strongbox的更多相关文章
- bzoj 2277 [Poi2011]Strongbox 数论
2277: [Poi2011]Strongbox Time Limit: 60 Sec Memory Limit: 32 MBSubmit: 527 Solved: 231[Submit][Sta ...
- 【BZOJ】2277: [Poi2011]Strongbox
题意 有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码.如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等).某人试了\(k\)次密码 ...
- bzoj2277 [Poi2011]Strongbox
2277: [Poi2011]Strongbox Time Limit: 60 Sec Memory Limit: 32 MBSubmit: 498 Solved: 218[Submit][Sta ...
- BZOJ 2530 Poi2011 Party 【枚举】
BZOJ 2530 Poi2011 Party Description Byteasar intends to throw up a party. Naturally, he would like i ...
- [bzoj 2216] [Poi2011] Lightning Conductor
[bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...
- [poi2011]bzoj 2277 —— strongbox·[洛谷3518]
·问题描述· 有一个密码箱,0到n-1中的某些数是它的密码.且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码.某人试了k次密码,前k-1次都失败了,最后一次成功. 问:该密码箱最多有多少 ...
- BZOJ 2277 strongbox (gcd)
题意 有一个密码箱,0到n-1中的某些整数是它的密码. 且满足,如果a和b都是它的密码,那么(a+b)%n也是它的密码(a,b可以相等) 某人试了k次密码,前k-1次都失败了,最后一次成功了. 问:该 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- [BZOJ 2350] [Poi2011] Party 【Special】
题目链接: BZOJ - 2350 题目分析 因为存在一个 2/3 n 大小的团,所以不在这个团中的点最多 1/3 n 个. 牺牲一些团内的点,每次让一个团内的点与一个不在团内的点抵消删除,最多牺牲 ...
随机推荐
- Learning-Python【16】:模块的导入使用
一.什么是模块 模块就是一系列功能的集合体,一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 模块有三种来源: 1.内置的模块 2.第三方的模块 3.自定义模块 ...
- websocket是如何进行建立连接与通信的?(简单理解)
握手过程: websocket-client端通过ws协议向websocket-server端发起连接请求前,首先在自己的请求头中添加Sec-Websocket-Key键值对,值为根据自己账号通过一定 ...
- 浅谈JS数据遍历的几种方式
遍历对象(数组)是我们日常撸码的必不可少的部分,如何从性能上优化代码,提高运行效率?下文为你揭开真像: 第一种:普通的for循环 for(j = 0; j < arr.length; j++) ...
- xml.libxml2_添加带tagname的xml文本(xmlNewTextChild)
1. 2.例子代码: int TgText::NodeNew_G2SVG(xmlNode* _pNodeCurrent_G, xmlNode* _pNodeParent_SVG, xmlNode** ...
- 关于vs code 快速生成vue 模板
在 文件>首选项>用户代码片断里面,打开vue.json 添加以下代码: "Print to console": { "prefix": " ...
- windows10安装MongoDB服务启动不了 😀✅已解决!
WIndows的服务中,有一个服务需要以NT AUTHORITY\NetworkService用户启动,但怎么也启动不起来,使用本地系统帐户启动没有任何问题,但是换成NetworkService就启 ...
- CSS清除浮动的方法及优缺点
浮动是CSS布局里面用的比较多的属性.浮动的框向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 因为浮动会使当前元素产生向上浮的效果,所以浮动的元素会脱离正常的文档流,它包围的内容在 ...
- linux下read命令详解
要与Linux交互,脚本获取键盘输入的结果是必不可少的,read可以读取键盘输入的字符. read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars ...
- Vue(八) 数字输入框组件案例
数字输入框是对普通输入框的扩展,用来快捷输入一个标准的数字,如图: 代码: <div id="app"> <input-number v-model=" ...
- SpringCloud使用Feign实现服务间通信
SpringCloud的服务间通信主要有两种办法,一种是使用Spring自带的RestTemplate,另一种是使用Feign,这里主要介绍后者的通信方式. 整个实例一共用到了四个项目,一个Eurek ...