题目大意:

一个有密码箱,数字是0~n-1,其中有若干个密码,密码的特点:若x是密码,y是密码,(x可以等于y)则(x+y)%n也是密码。

给一个n(<=10^14),一个k(k<=min(250000,n)),给k个数(a[k]<n),前k-1个数不是密码,第k个数是密码。

求在0~n-1中,最多有多少个数字是密码?

题解:

推荐(但是结论二的证明不太完整)

看起来和数论有一些关系。
而且一定是一个性质题。

结论1:若x是密码,则gcd(n,x)是密码

发现,x是密码,则k*x%n都是密码。

所以,一定存在一个t,c,使得t*x-n*c=gcd(n,x)

并且根据裴属定理,不能用x凑出一个更小的密码比gcd(n,x)更小,

结论2:若x,y是密码,则gcd(x,y)是密码。

根据裴属定理,p*x+q*y=gcd(x,y)有整数解。

如果q是负数q=-q,那么就是p*x+(c*n-q)*y=gcd(x,y)+c*n*y

那么,就存在非负数p,q使得p*x+q*y=gcd(x,y) mod n

结论3:若x是所有密码中最小的那一个,那么,所有的密码就是x,2x,3x,...kx,并且x是n的约数。

反证。设x是最小的,y是另一个密码,若x不是y的约数,那么gcd(x,y)<x,根据结论二,那么gcd(x,y)就是一个更小的密码。矛盾。

所以,任意的y都是x的倍数。

由于对于一个密码z,根据结论1,gcd(n,z)也是密码,所以,最小的密码x是gcd(n,z)的约数,也就是n的约数。

所以,如果我们求出了满足条件的x,那么n/x就是答案。

我们密码数量最多,所以,x必须取最小的。

由于给了一个a[k]是密码,而x又是n的约数,所以x就一定是gcd(a[k],n)的约数。

并且,x不能是a[1~k-1]的约数,只要是,那么x就能凑出ai,与ai不是密码矛盾。

只要不存在这样的ai,那么x一定可以是最小的密码(裴属定理可以证明)。

所以,我们可以枚举gcd(a[k],n)的约数,然后排序。

从小到大枚举x,再暴力验证是否是a[i]的约数,第一个符合的x,n/x就是答案。

O(ksqrt(n))

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=250000+5;
ll n,k;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;
}
ll a[N],fac[N];
int tot;
int main(){scanf("%lld%lld",&n,&k);for(int i=1;i<=k;i++)scanf("%lld",&a[i]);ll g=gcd(a[k],n);//cout<<"gg "<<g<<endl;for(ll i=1;i*i<=g;i++){if(g%i==0){fac[++tot]=i;if(i!=g/i) fac[++tot]=g/i;}}sort(fac+1,fac+tot+1);for(int i=1;i<=tot;i++){//cout<<fac[i]<<" ";bool fl=true;for(int j=1;j<=k-1;j++){if(a[j]%fac[i]==0){fl=false;break;}}if(fl){printf("%lld",n/fac[i]);return 0;}}//cout<<" over "<<endl;return 0;
}

 然而这个代码BZOJ过不去

还要优化。

发现,每次对一个因数判断所有的k个数代价太大。

一个a[i]影响的是哪些gcd(a[k],n)的因数呢?

一定是gcd(a[i],a[k])的因数。

所以,我们可以把所有的gcd(a[i],a[k])的因数找出来干掉。

然后直接再扫一遍,找到最小的没有被干掉的因数即可。

复杂度?O(sqrt(n)+klogn+玄学)

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ri register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
const int N=250000+5;
void rd(ll &x){x=0;char ch;while(!isdigit(ch=getchar()));for(x=numb;isdigit(ch=getchar());x=(x<<1)+(x<<3)+numb);
}
ll n,k;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;
}
ll a[N],fac[N];
bool kil[N];
int tot;
int main(){scanf("%lld%lld",&n,&k);for(ri i=1;i<=k;i++)scanf("%lld",&a[i]);ll g=gcd(a[k],n);for(ri i=1;i<k;++i) a[i]=gcd(a[i],g); for(ll i=1;i*i<=g;i++){if(g%i==0){fac[++tot]=i;if(i!=g/i) fac[++tot]=g/i;}}sort(fac+1,fac+tot+1);for(ri i=1;i<k;i++){kil[lower_bound(fac+1,fac+tot+1,a[i])-fac]=1;}    for(ri i=1;i<=tot;++i){if(kil[i]){for(int j=1;j<i;j++) {if(fac[i]%fac[j]==0) kil[j]=1;}}} for(ri i=1;i<=tot;++i){if(!kil[i]) {printf("%lld\n",n/fac[i]);return 0;}}return 0;
}

转载于:https://www.cnblogs.com/Miracevin/p/9777115.html

[POI2011]SEJ-Strongbox相关推荐

  1. BZOJ2277[Poi2011]Strongbox——数论

    题目描述 Byteasar is a famous safe-cracker, who renounced his criminal activity and got into testing and ...

  2. P3518 [POI2011]strongbox

    https://www.luogu.org/problem/show?pid=3518 问题描述: 有一个密码箱,0 到 n-1中的某些整数是它的密码,且满足:如果a和b都是它的密码,那么(a+b)% ...

  3. 【BZOJ】2277: [Poi2011]Strongbox

    题意 有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码.如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等).某人试了\(k\)次密码 ...

  4. 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个在 ...

  5. BZOJ2277: [Poi2011]Strongbox

    n<=10^14,0~n-1中有一些数是密码,且满足:a是密码,b是密码,那么(a+b)%n也是密码(a,b可相等),现小明试了m<=250000个数,前面都错,最后一个对,问n个数中最多 ...

  6. BZOJ2277 [Poi2011]Strongbox 【数论】

    题目链接 BZOJ2277 题解 orz太难了 如果一个数\(x\)是密码,那么所有\((x,n)\)的倍数都是密码 如果两个数\(x,y\)是密码,那么所有\((x,y)\)的倍数都是密码 那么如果 ...

  7. BZOJ 2277 Poi2011 Strongbox 数论

    题目大意:给定n和k个整数,求mod n加法下的群G的一个子群G',满足a[1]~a[k-1]都不在群中而a[k]在群中 首先易证G'一定是一个循环群 证明:显然若a在群中则a的逆元在群中 那么我们就 ...

  8. [bzoj2527][Poi2011]Meteors_整体二分_树状数组

    Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...

  9. [bzoj2213][Poi2011]Difference_动态规划

    Difference bzoj-2213 Poi-2011 题目大意:已知一个长度为n的由小写字母组成的字符串,求其中连续的一段,满足该段中出现最多的字母出现的个数减去该段中出现最少的字母出现的个数最 ...

  10. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

最新文章

  1. 模板 - 无向图的连通性
  2. 雷达成像技术_毫米波立体成像雷达技术研究
  3. 史上最坑的证书报错解决方法:Code=3000 未找到应用程序的“aps-environment”的权利字符串
  4. Gym - 100543L
  5. 【物理总结】初中物理重要常数、单位换算、概念、规律和理论及知识的应用归纳大全梳理总结...
  6. 浏览器从输入URL到页面渲染过程 ——页面渲染流程
  7. 计算机应用与基础进制,计算机应用基础选择题-删进制、字符题(2).docx
  8. Script component 用法
  9. 2019-03-13
  10. Orchard核心机制
  11. mac新手入门:从启动台Launchpad中完全删除应用程序
  12. 消息中间件的研究 (一)
  13. Java工程师成神之路【转】
  14. 聚类分析原理及R语言实现过程
  15. QtWebApp的使用【在Qt中搭建HTTP服务器】(三)
  16. 计算机教程无线路由器桥接上网,两个无线路由器怎么桥接?如何桥接两个无线路由器...
  17. 数据分析专题报告范文6篇_【2018最新】数据分析报告范文-优秀word范文 (5页)
  18. 什么pdf转换成excel转换器好
  19. Excel图表10——改进难易矩阵(气泡图)
  20. web js活码生成二维码

热门文章

  1. 采用EM算法对高斯混合模型(GMM)进行参数估计
  2. 2021年万众瞩目的前端学习路线图来了
  3. 4.1 用格雷戈里公式求π的近似值
  4. PHP获取用户访问IP地址的5种方法
  5. st7920驱动OCMJ2X8C屏使用CGRAM自定义图标
  6. 联想计算机网络唤醒是怎么回事,笔记本开启网络唤醒功能设置的操作方法
  7. 使用Kaggle API下载数据集
  8. SQL数据库中的一列数据按照英文字母先后顺序排列,怎么可以做到?
  9. Ubuntu设置MySQL远程访问
  10. 中国大学排名爬取代码更新