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 能除尽 ...
随机推荐
- SQL映射器Mapper接口(MyBatis)
SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现.直接把以前的dao接口定义成符合规则的Mapper. 注意事项: 1.接口必须以Mapper结尾,名字是Dom ...
- 100天搞定机器学习|day54 聚类系列:层次聚类原理及案例
几张GIF理解K-均值聚类原理 k均值聚类数学推导与python实现 前文说了k均值聚类,他是基于中心的聚类方法,通过迭代将样本分到k个类中,使每个样本与其所属类的中心或均值最近. 今天我们看一下无监 ...
- PAT(B) 1088 三人行(Java)
题目链接:1088 三人行 (20 point(s)) 参考博客:PAT (Basic Level) Practice (中文)1088 三人行 (20 分)(Java实现)吃口雪花 题目描述 子曰: ...
- babel tsc webpack
我要用啥?js的话:babel编译+webpack模块打包ts的话:tsc编译成js+babel编译+webpack模块打包浏览器情况:如果您的浏览器支持es6所有语法那么就可以只用webpack来处 ...
- vue cli3 项目优化
vue-cli3 Prefetch (官网内容) <link rel="prefetch"> 是一种 resource hint,用来告诉浏览器在页面加载完成后,利用空 ...
- [Luogu5280][ZJOI2019]线段树(线段树+DP)
https://www.luogu.org/blog/Sooke/solution-p5280 首先想到对线段树上每个点分别维护有多少棵线段树在它上有标记(f[]),然后想到对于每个操作,根据转移的不 ...
- 安装Nginx报错“Cannot retrieve metalink for repository: epel. Please verify its path and try again”
CentOS 6.5中通过yum安装nginx报错. 搜了一下,很多都是修改某个配置文件的.但是在StackOverFlow的某个问题下,有人回答说修改配置文件并不是一个好的方法,虽然我采用了这个人的 ...
- 使用postman mock server
需要写一个小的Java程序,用来调用云平台的接口 由于云平台的接口程序还没有写好,只能用模拟的方式先行开发代码, 用了post来模拟接口程序. 需要模拟的接口如下: ■请求地址 /openapi/ip ...
- vs项目模板创建和使用
一.使用dotnet命令创建(适用于.NET Core,可以创建包含任意数量个项目的模板,但不会出现在vs的新建项目模板中) 官方文档:https://docs.microsoft.com/zh-cn ...
- Python Scrapy 实战
Python Scrapy 什么是爬虫? 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. Python 爬虫 ...