题意

有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码。如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等)。某人试了\(k\)次密码,前\(k-1\)次都失败了,最后一次成功了。该密码箱最多有多少不同的密码。

分析

假设集合\(s\)为答案,则令\(g=gcd(s_i)\),则显然\(kg, k \ge 0\)都是答案。一共有\(\frac{n}{g}\)个。

所以我们找一个最小的\(g\),满足\(g|n, g|a_n, g \nmid a_i(i < n)\)即可。

题解

首先求出\(g=gcd(n, a_n)\)的所有约数。首先将等于\(a_i(i < n)\)的约数去掉,然后从小到大枚举。如果\(b_i * p_j\)被去掉了,显然\(b_i\)也要被去掉。然后一直做下去就行了。复杂度\(O(n^{0.5}log^2n)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. inline ll getint() {
  5. ll x=0;
  6. int c=getchar();
  7. for(; c<48||c>57; c=getchar());
  8. for(; c>47&&c<58; x=x*10+c-48, c=getchar());
  9. return x;
  10. }
  11. const int M=1000005, N=250005;
  12. inline ll gcd(ll a, ll b) {
  13. return b?gcd(b, a%b):a;
  14. }
  15. ll a[N], b[M], c[M], n;
  16. int K, cnt, tot;
  17. bool no[M];
  18. int main() {
  19. ll n=getint();
  20. int K=getint();
  21. for(int i=1; i<=K; ++i) {
  22. a[i]=getint();
  23. }
  24. ll g=gcd(a[K], n), z;
  25. for(z=1; z*z<g; ++z) {
  26. if(g%z==0) {
  27. b[tot++]=z;
  28. b[tot++]=g/z;
  29. }
  30. }
  31. if(z*z==g) {
  32. b[tot++]=z;
  33. }
  34. sort(b, b+tot);
  35. ll t=g;
  36. for(z=2; z*z<=t; ++z) {
  37. if(t%z==0) {
  38. c[cnt++]=z;
  39. for(t/=z; t%z==0; t/=z);
  40. }
  41. }
  42. if(t!=1) {
  43. c[cnt++]=t;
  44. }
  45. for(int i=1; i<K; ++i) {
  46. ll x=gcd(a[i], g);
  47. no[lower_bound(b, b+tot, x)-b]=1;
  48. }
  49. for(int i=tot-1; i>=0; --i) {
  50. if(no[i]) {
  51. continue;
  52. }
  53. ll x=b[i];
  54. for(int j=0; j<cnt && x<=g/c[j]; ++j) {
  55. ll y=x*c[j];
  56. int k=lower_bound(b, b+tot, y)-b;
  57. if(b[k]==y && no[k]) {
  58. no[i]=1;
  59. break;
  60. }
  61. }
  62. }
  63. for(int i=0; i<tot; ++i) {
  64. if(!no[i]) {
  65. printf("%lld\n", n/b[i]);
  66. return 0;
  67. }
  68. }
  69. return 0;
  70. }

【BZOJ】2277: [Poi2011]Strongbox的更多相关文章

  1. 【BZOJ】2216: [Poi2011]Lightning Conductor

    题意 给一个长度为\(n\)的序列\(a_i\),对于每个\(1 \le i \le n\),找到最小的非负整数\(p\)满足 对于任意的\(j\), \(a_j \le a_i + p - \sqr ...

  2. 【BZOJ】2212: [Poi2011]Tree Rotations

    题意 给一棵\(n(1 \le n \le 200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 分析 可以发现如果交换非叶结点的左右子树,对子树内的交换无影响, ...

  3. bzoj 2277 [Poi2011]Strongbox 数论

    2277: [Poi2011]Strongbox Time Limit: 60 Sec  Memory Limit: 32 MBSubmit: 527  Solved: 231[Submit][Sta ...

  4. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  5. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  6. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  7. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  8. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  9. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

随机推荐

  1. bt和wifi的共存

    转自:http://bbs.52rd.com/Thread-291892-1-1.html 蓝牙和802.11b/g/n都可能工作在2.4GISM,可能互相干扰.干扰的典型应用之一是VOIP,用手机的 ...

  2. 设计模式学习之代理模式(Proxy,结构型模式)(11)

    参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...

  3. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  4. tornado使用(Mac)

    安装需求 Tornado 在 Python 2.5, 2.6, 2.7 中都经过了测试.要使用 Tornado 的所有功能,你需要安装 PycURL (7.18.2 或更高版本) 以及 simplej ...

  5. C# 重绘tabControl,添加关闭按钮(页签)

    C# 重绘tabControl,添加关闭按钮(页签) 调用方法 参数: /// <summary> /// 初始化 /// </summary> /// <param n ...

  6. Linux学习笔记(11)软件包管理

    Linux中的软件包分为源码包(脚本安装包)及二进制包(RPM包.系统默认包).其中源码包的优点是: 1)源码包是开源的,如果有足够的能力,可以修改源代码: 2)可自由选择所需的功能: 3)源码包需编 ...

  7. Java api

    StringBuilder.charAt(int index); StringBuilder.deleteCharAt(int index); StringBuilder.setCharAt(int ...

  8. [导入]Eclipse 导入/编译 Hadoop 源码

    http://www.cnblogs.com/errorx/p/3779578.html 1.准备工作 jdk: eclipse: Maven: libprotoc :https://develope ...

  9. js高级技巧之高级定时器

    实际上,浏览器负责进行排序,指派某段代码在某个时间点运行的优先级. 可以吧js想象成在时间线上运行的. JavaScript中没有任何代码是立刻执行的,但一旦进程空闲则尽快执行. 1.重复的定时器: ...

  10. 纯css实现两列等高

    <!doctype html> <html> <head> <meta /> <title>Title</title> < ...