密码 [SEJ-Strongbox ]

题目链接:密码 [SEJ-Strongbox ]
(这是一道数论蓝题,想了好长时间啊~~)
【题目大意】
有一个密码箱,0到n-1中的某些整数是它的密码。且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码(a,b可以相等,%表示整除取余数),某人试了k次密码,前k-1次都失败了,最后一次成功了。
问:该密码箱最多有多少不同的密码。
【样例】

输入:
42 5
28 31 10 38 24
输出:
14

【题解】:

首先从题目中的出的两个结论:

结论一:

如果x为密码,那么gcd(x,n)gcd(x,n)gcd(x,n)也是密码。

证明:

因为x是密码,由题意得2x%n,3x%n……kx%n都是密码。
由于不定方程ax+by=cax+by=cax+by=c有整数解的充要条件是gcd(a,b)∣cgcd(a,b)|cgcd(a,b)∣c,所以 xk+nc=gcd(x,n)xk+nc=gcd(x,n)xk+nc=gcd(x,n)一定有整数解,那么∃k∈Z∃k∈Z∃k∈Z使kx≡gcd(x,y)(modn)kx ≡ gcd(x,y)(mod n)kx≡gcd(x,y)(modn),故gcd(x,n)也是密码。

结论二:

如果x,y为密码,那么gcd(x,y)gcd(x,y)gcd(x,y)也是密码。

证明:

由题意得:以为x,y是密码,显然(px+qy)% n也是密码,因为xp+yq=gcd(x,y)xp+yq=gcd(x,y)xp+yq=gcd(x,y)一定有整数解,那么∃p,q∈Z∃ p,q∈Z∃p,q∈Z使得px+qy≡d(modn)px+qy≡d(mod n)px+qy≡d(modn),故gcd(x,y)gcd(x,y)gcd(x,y)也是密码。

再看看这道题,设 x,yx,yx,y 均为密码且x是所有密码中最小的,若x∤yx∤yx∤y,则gcd(x,y)&lt;xgcd(x,y)&lt;xgcd(x,y)<x且 gcd(x,y) 是密码(结论二),与假设矛盾,故 x∣yx|yx∣y。因此,这组密码为x,2x,3x,⋯,kx(kx&lt;n)x,2x,3x,⋯,kx (kx&lt;n)x,2x,3x,⋯,kx(kx<n)
设d=gcd(mk,n)d=gcd(mk,n)d=gcd(mk,n),由于mkmkmk是密码,根据结论一,d 也是密码,又由①得:x∣dx|dx∣d(仍设x是所有密码中最小的那个)

但是这道题给了一些限制条件:

  1. 要求最多有多少密码,故我们希望x尽量的小,密码数量为n/x
  2. 给出了k−1个不是密码的数字,故 x 不能整除 m1,m2,⋯,mk−1
    综上所述,这道题的实现方法是:在根号的时间里暴力枚举处理出 gcd(mk,n) 的所有因数,去除能整除 m1,m2,⋯,mk−1 中任意一个的数,设剩下的数中最小的为x,则答案就是 n/x

AC代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int sea=250010;
LL a[sea],q[sea],f[sea],n,k,tot=0,ans;
LL gcd(LL a,LL b){if(a<b) swap(a,b); return b?gcd(b,a%b):a;}
int main()
{scanf("%lld%lld",&n,&k);for(int i=1;i<=k;i++) scanf("%lld",&a[i]);a[k]=gcd(a[k],n);for(int i=1;i<k;i++) a[i]=gcd(a[i],a[k]);for(LL i=1;i*i<=a[k];i++)if(a[k]%i==0) {q[++tot]=i;if(i!=a[k]/i) q[++tot]=a[k]/i;}sort(q+1,q+tot+1);for(int i=1;i<k;i++)f[lower_bound(q+1,q+tot+1,a[i])-q]=1;for(int i=1;i<=tot;i++)if(f[i])for(int j=1;j<i;j++)if(q[i]%q[j]==0) f[j]=1;ans=1; while(f[ans]) ans++;printf("%lld\n",n/q[ans]);return 0;
}

continue……

【数学一本通 第一章】SEJ-Strongbox [LUOGU] [POI2011]相关推荐

  1. 【数学一本通 第一章】Semi-prime H-numbers[UVA11105]

    题目: 题目链接:Semi-prime H-numbers 题解: 一个线性筛的变式题,还是很推荐做一下的. 代码: #include<bits/stdc++.h> using names ...

  2. MATLAB本金p以每年,matlab数学实验--第一章

    一.数据和变量: 省略号(三个英文句点):表示换行 历史指令调用:用方向键上下 数据显示格式: format short format long format rational 复数: I,j rea ...

  3. 《什么是数学》第一章自然数习题

    1.证明:从以十为基底的系统变成基底为B的一般规则是:用B连续除以十为基底的整数Z,所得的余数将是以B为基底的系统中的数码. 证明:直接做除法,把过程完全表达出来,然后从算术规则里找规律. 假设以十为 ...

  4. 【学习笔记 · 具体数学】第一章 递归问题

    第一章通过三个样本问题来认识递归问题.它们: ①足够经典,被反复研究: ②都通过递归方法解决,每个问题都依赖于形式相同但规模更小的问题: ③都能够使用计算机程序实现. 目录 1 汉诺塔问题 Hanoi ...

  5. python 正数变成负数_初一数学上册第一章有理数1.1正数和负数基础知识概括及同步练习题含解析...

    语文资料 数学资料 英语资料 政史地资料 物化生资料 高中资料 正数和负数 正数和负数的概念 (1) 像3.1.5.1/2.584等大于0的数,叫做正数,在小学学过的数,除0以外都是正数,正数比0大. ...

  6. 数学实验第一章:MATLAB基础

    基本操作命令 命令 该命令的功能 命令 该命令的功能 cd 显示或改变工作目录 hold 图形保持命令 clear 清除内存变量 pack 整理内存碎片 clf 清除图形窗口 path 显示搜索目录 ...

  7. 信息学奥赛数学一本通 数论相关题目

    ​[数论]教堂 [数论]教堂_LZK1997的博客-CSDN博客 [数论]教堂_AKone123456的博客-CSDN博客 [数论]密码 [数论]密码_)NCuyALnA$Ke的博客-CSDN博客 [ ...

  8. 专接本数学第一章知识梳理(1)

    本篇文章适用于专接本数学的考生,想要学好数学,第一章第二章第三章的基础一定要打牢,这会使你学习后续章节不会感到特别吃力,所以,一定!一定!!一定!!!要学好第123章的知识.这篇文章主要总结了基本函数 ...

  9. 红书《题目与解读》第一章 数学 题解《ACM国际大学生程序设计竞赛题目与解读》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 红书<题目与解读>第一章 数学 题解<ACM国际大学生程序设计竞赛题目与解读> ...

最新文章

  1. groovy学习(一)
  2. SQLSERVER压缩数据文件的用处有多大
  3. [转]Reporting Service部署之访问权限
  4. 【AD】AD20差分等长布线
  5. 旗舰杀手!红米旗舰定名 干翻全场?
  6. [CLR via C#]18. Attribute
  7. LINUX编译OpenJDK8:cc1plus: all warnings being treated as errors
  8. Oracle PL/SQL中使用%TYPE和%ROWTYPE的方法
  9. Win11录屏方法介绍
  10. 统计学理论—假设检验
  11. Mybatis关联查询遇到的坑-无主键的关联数据去重
  12. TiDB PCTP(PingCAP 认证 TiDB 数据库专家) 认证考试高分攻略
  13. 经典c语言程序创意,49个经典年会小游戏(绝对有创意)C
  14. 【我的Android进阶之旅】Android实现中文汉字笔划(笔画)排序、中文拼音排序、英文排序的国家地区选择界面
  15. 中级微观经济学:Chap 14 消费者剩余
  16. Selenium中级 | 在Selenium中模拟键盘操作
  17. Latex 制作表格出现以下错误 Extra alignment tab has been changed to \cr
  18. C#排序算法之希尔排序
  19. python物理模拟_如何在Python 游戏中模拟引力
  20. windows系统如何解决卸载matlab7时总提示exception calling main

热门文章

  1. rtsp有没有好使_求几个可用的稍微清晰点的RTSP播放源,最好是上海的!
  2. BIOS密码的去除与破解
  3. 【原创】harvey指导soc裸机程序文件头等制作_Detective_ALong_新浪博客
  4. Android仿余额宝实现七天年化收益率图表
  5. Ambari界面介绍
  6. 求阶乘求1!+2!+…+20!,其中x!=1*2*…*x,表示阶乘
  7. [SpringBoot]使用token 短信验证码 Redis的功能实现基本的登陆注册操作(含Redis token 验证码如何配置)
  8. Server2012R2下安装intel 82579v网卡驱动
  9. 蜗牛星际集成:PVE系统+NAS+WEB 折腾笔记
  10. Cunti 使用简介