题意

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

题解

我们先把000看做nnn。

显然有这样一个性质:

xxx是密码,k∗gcd(x,n)(k∈N+)k*gcd(x,n)(k\in \N_+)k∗gcd(x,n)(k∈N+​)一定是密码。

yyy不是密码,gcd(x,y)gcd(x,y)gcd(x,y)及其因数一定不是密码。

如果能够算出最小的密码,那么最多密码数为(n/n/n/最小密码)

然后就可以做这道题了,先把最后一个密码与nnn取gcdgcdgcd。最小密码一定是这个数的因数。

然后把a1...(k−1)a_{1...(k-1)}a1...(k−1)​都和这个数取gcdgcdgcd。那么现在的a1...(k−1)a_{1...(k-1)}a1...(k−1)​的因数都一定不是密码。

设约数个数为cntcntcnt,时间复杂度O(cntlog⁡nlog⁡cnt)O(cnt\log n\log cnt)O(cntlognlogcnt)

CODE

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 250005;
LL n, a[MAXN], q[MAXN], p[MAXN];
int m, k;
bool f[MAXN];
int main () {
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= m; ++i) scanf("%lld", &a[i]);
a[m] = __gcd(a[m], n);
for(int i = 1; i < m; ++i) a[i] = __gcd(a[i], a[m]);
int cnt = 0;
for(int i = 1; 1ll*i*i <= a[m]; ++i) if(a[m]%i==0)
q[++cnt] = i, q[++cnt] = a[m]/i; //q存因数
for(int i = 2; 1ll*i*i <= a[m]; ++i) if(a[m]%i==0) {
p[++k] = i; //p存质因数
while(a[m]%i==0)a[m]/=i;
}
if(a[m]>1)p[++k] = a[m];
sort(q + 1, q + cnt + 1);
for(int i = 1; i < m; ++i) f[lower_bound(q + 1, q + cnt + 1, a[i]) - q] = 1;
for(int i = cnt; i >= 1; --i)
for(int j = 1; q[i]*p[j] <= q[cnt] && j <= k && !f[i]; ++j) { //log n
int k = lower_bound(q + 1, q + cnt + 1, q[i]*p[j]) - q; //log cnt
if(q[k] == q[i]*p[j] && f[k]) f[i] = 1;
}
int ans = 1; while(f[ans]) ++ans;
printf("%lld\n", n/q[ans]);
}

BZOJ 2277 strongbox (gcd)的更多相关文章

  1. IOS多线程(GCD)

    简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...

  2. IOS学习之十七:Grand Central Dispatch(GCD)编程基础

    IOS学习之十七:Grand Central Dispatch(GCD)编程基础   有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...

  3. Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)

    1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...

  4. [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)

    [BZOJ 2257][JSOI2009]瓶子和燃料 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子 ...

  5. 4.3 多线程进阶篇<中>(GCD)

    更正:队列名称的作用的图中,箭头标注的有些问题,已修正 本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Gith ...

  6. 求最大公约数(GCD)的两种算法

    之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种.在处理大数时更优秀的算法--Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a% ...

  7. 紫书 习题 10-8 UVa 10622(gcd)

    把这个数质因数分解然后求因子个数的gcd就ok了. 一些细节 (1)这道题的质因数不需要存下来,每一次做完取一次gcd就ok了 (2)判断奇偶用ans & 1的时候要加括号, 位运算要注意括号 ...

  8. 数论-质因数(gcd) UVa 10791 - Minimum Sum LCM

    https://vjudge.net/problem/UVA-10791/origin 以上为题目来源Google翻译得到的题意: 一组整数的LCM(最小公倍数)定义为最小数,即 该集合的所有整数的倍 ...

  9. [LeetCode]1071. 字符串的最大公因子(gcd)

    题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...

随机推荐

  1. js 中加减乘除 比较精确的算法,js本身有些运算会出错,这里给出较精确的算法

    问题这样的: 37.5*5.5=206.08  (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...

  2. 题解-CTS2019氪金手游

    Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...

  3. windows下安装phpredis扩展

    根据phpyinfo获取自己的php信息 x86,php5.6,TS,VC11 在pecl网站上找到对应的版本 5.6 Thread Safe (TS) x86 https://pecl.php.ne ...

  4. Java Swing中文乱码解决方法

    Run As Run Configuration,在Arguments中增加下面这句: -Dfile.encoding=gbk

  5. STM8 LED

    时钟分频寄存器(CLK_CKDIVR) 举例 int main() { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //高速内部时钟1分频 GPIO_ ...

  6. Android NDK 学习之在C中调用Java的变量和静态变量

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  7. 【SpringMVC】拦截器

    一.概述 1.1 拦截器的异常场合 1.2 拦截器中的方法 二.示例 2.1 定义两个拦截器 2.2 配置拦截器 2.3 执行顺序 三.拦截器应用 3.1 需求 3.2 用户登陆及退出功能开发 3.3 ...

  8. Linux系统用终端打开图片

    一.现在开发多数使用的系统都是linux系统,但有的时候会遇到一些比较麻烦的小问题,比如:在某个文件夹中存入大量的图片时,想要查看某张图片的时候,当你使用图形化显示的时候,就会很卡,所以在这里我针对于 ...

  9. 【DevOps】在Rancher2中启动Docker-Registry仓库服务

    准备 拥有Rancher2环境,已经在Rancher2配置Kubernetes集群 拥有域名,拥有SSL证书,可以自行在阿里云申请 启动Docker-Registry仓库服务 第一步:进入集群应用 第 ...

  10. 使用Atmel Studio编程Arduino Uno开发板

    使用Atmel Studio 7编程Arduino Uno开发板非常简单.Arduino Uno开发板是使用AVR微控制器的嵌入式应用开发的著名平台之一. 大多数人通常会使用Arduino自己的软件工 ...