·问题描述·

  有一个密码箱,0到n-1中的某些数是它的密码。且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码。某人试了k次密码,前k-1次都失败了,最后一次成功。

  问:该密码箱最多有多少个密码?

·输入格式·

  输入第一行两个整数分别表示n,k。

  第二行为k个用空格隔开的非负整数,表示每次试的密码。(数据保证存在合法解)

·输出格式·

  输出一行一个数,表示结果。

·输入样例·

42 5

28 31 10 38 24

·输出样例·

14

·数据范围·

对于100%的数据:1<=k<=250000,k<=n<=10^14。

Solution:

  本题考察数学。由题意可知,若x为密码则(x+x)%n为密码,则p*x%n(0<p<n)也为密码。而对于p*x%n=q,等价于p*x-n*c=q。

  由引理:a*x+b*y=c(均为整数),有整数解的充要条件是gcd(a,b)|c。证明很容易:不妨设a=p*gcd(a,b),b=q*gcd(a,b) --> a*x+b*y=(p+q)*gcd(a,b)=c,显然要有整数解,则gcd(a,b)|c。

  回到本题的条件:p*x-n*c=q。有解则必定满足gcd(x,n)|q,所以必定有p*x-n*c=gcd(x,n)成立,等价于p*x%n=gcd(x,n),则gcd(x,n)一定为一个密码。类似的,对于不同的密码x和y,存在(p*x+q*y)%n为密码,由引理必定存在p*x+q*y=gcd(x,y),与单个x是密码同理gcd(x,y)一定是密码。

  而要使得密码最多,由x是密码则p*x%n(0<p<n)为密码可知,当x为最小时,密码最多有n/x个。

  具体实现时,我们先求出a[k]=gcd(a[k],n),再使a[i]=gcd(a[i],a[k]),然后从新的a[k]中删去所有是a[i]因子的因子,最后输出答案就是n除以没被删的最小的因子。

代码:

 /*数学一本通上的例题——by 520*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
ll n,k,tot,a[],q[],p[],cnt=;
il ll gi(){
ll a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main()
{
freopen("strongbox.in","r",stdin);
freopen("strongbox.out","w",stdout);
n=gi(),k=gi();
for(int i=;i<=k;i++)a[i]=gi();
a[k]=gcd(a[k],n);
for(int i=;i<k;i++)a[i]=gcd(a[k],a[i]);
for(ll i=;i*i<=a[k];i++)
if(a[k]%i==){
q[++tot]=i;
if(i*i!=a[k])q[++tot]=a[k]/i;
}
sort(q+,q+tot+);
for(int i=;i<k;i++)p[lower_bound(q+,q+tot+,a[i])-q]=;
for(int i=;i<=tot;i++)
if(p[i])
for(int j=;j<i;j++)
if(q[i]%q[j]==)p[j]=;
while(p[cnt])cnt++;
cout<<n/q[cnt];
return ;
}

[poi2011]bzoj 2277 —— strongbox·[洛谷3518]的更多相关文章

  1. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  2. BZOJ 2277 strongbox (gcd)

    题意 有一个密码箱,0到n-1中的某些整数是它的密码. 且满足,如果a和b都是它的密码,那么(a+b)%n也是它的密码(a,b可以相等) 某人试了k次密码,前k-1次都失败了,最后一次成功了. 问:该 ...

  3. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  4. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  5. BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations

    BZOJ原题链接 洛谷原题链接 线段树合并裸题. 因为交换子树只会对子树内部的逆序对产生影响,所以我们计算交换前的逆序对个数和交换后的个数,取\(\min\)即可. 对每个叶子节点建一棵动态开点线段树 ...

  6. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  7. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  8. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  9. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

随机推荐

  1. Luogu1445 [Violet]樱花

    题面 题解 $$ \frac 1x + \frac 1y = \frac 1{n!} \\ \frac{x+y}{xy}=\frac 1{n!} \\ xy=n!(x+y) \\ xy-n!(x+y) ...

  2. 【BZOJ2754】[SCOI2012]喵星球上的点名

    [BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...

  3. #333. 【NOIP2017】宝藏

    #333. [NOIP2017]宝藏 http://uoj.ac/problem/333 1.错误的$n^42^n$做法: dp[s]表示当前的点集为s,然后从这些点中选一个做起点i,然后枚举边,然后 ...

  4. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用

    很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...

  5. angularjs 路由机制

    前言 AngularJS路由主要有内置的ngRoute和一个基于ngRoute开发的第三方路由模块ui-router,内置的ngRoute有时满足开发需求,使用ui-router可以解决很多原生ngR ...

  6. [.NET] 使用HttpClient操作HFS (HTTP File Server)

    前言 本篇文章介绍如何使用HttpClient操作HFS (HTTP File Server),为自己留个纪录也希望能帮助到有需要的开发人员.关于HTTP File Server的介绍.安装.设定,可 ...

  7. svn 配置仓库

    1.新建一个空文件夹,然后点击--在此创建版本库. 2.修改conf 下的 svnserve.conf : anon-access = read auth-access = write passwor ...

  8. [network]RIP协议

    水平分割:一种避免路由环路的出现和加快路由汇聚的技术. 原理:路由器从某个接口接收到的更新信息不允许再从这个接口发送回去. 优点:1. 阻止路由环路产生:2. 减少路由器更新信息占用的链路带宽资源. ...

  9. JAVA基础学习之路(九)[2]String类常用方法

    字符与字符串: 1.将字符数组变为字符串(构造方法) public String(char[] value) Allocates a new String so that it represents ...

  10. 【ML系列】简单的二元分类——Logistic回归

    对于了解机器学习中二元分类问题的来源与分析,我认为王树义老师这篇文章讲的非常好,通俗且易懂: http://blog.sciencenet.cn/blog-377709-1121098.html 但王 ...