BZOJ 2277 strongbox (gcd)
题意
有一个密码箱,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(cntlognlogcnt)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)的更多相关文章
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- IOS学习之十七:Grand Central Dispatch(GCD)编程基础
IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...
- Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)
1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...
- [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)
[BZOJ 2257][JSOI2009]瓶子和燃料 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子 ...
- 4.3 多线程进阶篇<中>(GCD)
更正:队列名称的作用的图中,箭头标注的有些问题,已修正 本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Gith ...
- 求最大公约数(GCD)的两种算法
之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种.在处理大数时更优秀的算法--Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a% ...
- 紫书 习题 10-8 UVa 10622(gcd)
把这个数质因数分解然后求因子个数的gcd就ok了. 一些细节 (1)这道题的质因数不需要存下来,每一次做完取一次gcd就ok了 (2)判断奇偶用ans & 1的时候要加括号, 位运算要注意括号 ...
- 数论-质因数(gcd) UVa 10791 - Minimum Sum LCM
https://vjudge.net/problem/UVA-10791/origin 以上为题目来源Google翻译得到的题意: 一组整数的LCM(最小公倍数)定义为最小数,即 该集合的所有整数的倍 ...
- [LeetCode]1071. 字符串的最大公因子(gcd)
题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...
随机推荐
- [EF] - "已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭" 之解决
错误 解决 在 ConnectionString 中添加 MultipleActiveResultSets=true(适用于SQL 2005以后的版本).MultipleActiveResultSet ...
- 解决idea中maven项目无法读取src/main/java目录下面的配置文件问题
解决idea中maven项目无法读取src/main/java目录下面的配置文件问题 当我们在maven项目中使用Mybatis的时候,需要给Mybatis配置核心xml文件(MyBatis-Conf ...
- Word 域代码使用方法
插入域「Crtl+F9」 更新域「F9」 切换域代码「Alt+F9」 批量删除域 打开 Word 文档,全选,按下「Alt+F9」键,将 Word 中所有的域结果切换为域代码的形式. 调出" ...
- STL源码剖析——iterators与trait编程#2 Traits编程技法
在算法中运用迭代器时,很可能用到其相应类型.什么是相应类型?迭代器所指对象的类型便是其中一个.我曾有一个错误的理解,那就是认为相应类型就是迭代器所指对象的类型,其实不然,相应类型是一个大的类别,迭代器 ...
- STL源码剖析——空间配置器Allocator#1 构造与析构
以STL的运用角度而言,空间配置器是最不需要介绍的东西,因为它扮演的是幕后的角色,隐藏在一切容器的背后默默工作.但以STL的实现角度而言,最应该首先介绍的就是空间配置器,因为这是这是容器展开一切运作的 ...
- golang 切片使用注意事项
// list 默认值为nil,可以直接append值,有值后json后为数组对象,但如果没有初始化空间的话,json编码后为null var list []*Pepole // list 初始化空间 ...
- dotnet Core学习之旅(二):安装IDE
[重要:文中所有外链不能确保永久有效] >开发工具 高效的开发必然需要一个优秀的集成开发环境(IDE) 对于.NET Core 2.x可以使用包括但不限于以下IDE来进行开发. Visual S ...
- Oracle和SQL Server 用当前日期减去 '0001-01-01' 得出的天数不一致,相差2天,谁知道原因?
Oracle和SQL Server 用当前日期减去 '0001-01-01' 得出的天数不一致,相差2天.求大佬科普
- jdk8新特性--使用lambda表达式的延迟执行特性优化性能
使用lambda表达式的延迟加载特性对代码进行优化:
- 使用parted对Linux未分区部分进行分区
1. 使用命令parted -l 查看当前分区 可以看到硬盘有2396GB即有2.5T , 但是分区就分了50G一个盘, 需要分剩下部分 [root@localhost ~]# parted -l M ...