题目大意:一个集合A,包含了0~n-1这n个数。另有一个集合B,满足:

      1.B是A的子集。

      2.如果a、b均在B中,则(a+b)%n也在B中(a=b亦可)

    给出k个数ai,前k-1个不在B中,第k个在B中,问B最大有几个元素。

数据范围:1<=k<=250000,k<=n<=1e14;

(以下x,y均代表互不相关的整数)

考虑集合B。

假设B中有一元素v。则方程 v*x-n*y=c(即v*x与c对n同余)当且仅当gcd(v,n)|c 时有正整数解x,y。

那么显然c=gcd(v,n)时方程有正整数解x,y。则v∈B->gcd(v,n)∈B……①

又因为方程 v*x+u*y=gcd(u,v)必有整数解x、y,所以根据B的特点2可得 u,v∈B->gcd(u,v)∈B……②

根据题意,(gcd(v,n)*x)%n也必在B中……③

由①、②,设B中所有数的最大公约数与n的最大公约数为g,则g必在B内且为B中最小正整数,又根据③,g,2*g,3*g,4*g……均在B中。有因为g是所有元素的最大公约数,所以B中不会再有别的元素。

以上,我们只要求出满足条件的最小g即可。g的限制条件如下:ai%g!=0,gcd(n,ak)%g==0。

最自然的想法是O(sqrt(gcd(n,ak)))枚举g再对于每个g进行O(k)检验,显然会T。然后……我就不会做了……

根据机智的题解,到这一步我们有以下两种做法:

一、

对于1<=n<=1e14,n最多有17280个因子,那么我们发现g最多有17280个。将所有gcd(n,ai)去重后,个数也会降到17280以下。这样效率就基本OK了。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int sz=25e4+5;
 5 ll k,a[sz],n,q;
 6 int l,len;
 7 ll gcd(ll a,ll b){
 8     return b?gcd(b,a%b):a;
 9 }
10 bool ck(ll v){
11     for(int i=1;i<=l;i++)
12         if(a[i]%v==0)return 0;
13     return 1;
14 }
15 int main(){
16     scanf("%lld%lld",&n,&k);
17     for(int i=1;i<=k;i++){
18         scanf("%lld",&a[i]);
19         a[i]=gcd(a[i],n);
20     }
21     sort(a+1,a+k);
22     for(int i=1;i<k;i++)
23         if(a[i]!=a[i-1])a[++l]=a[i];
24     for(ll j=1;j*j<=a[k];j++)if(a[k]%j==0){
25         if(ck(j)){
26             printf("%lld",n/j);
27             return 0;
28         }
29         if(ck(a[k]/j))q=a[k]/j;
30     }
31     printf("%lld",n/q);
32     return 0;
33 }

二、

在某数学一本通上看到的,但是它的代码和说明蒟蒻我都没看懂,感兴趣的大佬可以看看这篇,貌似和某数学一本通一模一样,看懂的大佬好心的话来教教我。

转载于:https://www.cnblogs.com/BLeaves/p/8639190.html

BZOJ 2277 Poi2011 Strongbox相关推荐

  1. BZOJ 2277 Poi2011 Strongbox 数论

    题目大意:给定n和k个整数,求mod n加法下的群G的一个子群G',满足a[1]~a[k-1]都不在群中而a[k]在群中 首先易证G'一定是一个循环群 证明:显然若a在群中则a的逆元在群中 那么我们就 ...

  2. 【BZOJ】2277: [Poi2011]Strongbox

    题意 有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码.如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等).某人试了\(k\)次密码 ...

  3. BZOJ 2277 strongbox (gcd)

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

  4. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)

    2216: [Poi2011]Lightning Conductor Time Limit: 25 Sec  Memory Limit: 64 MB Submit: 1292  Solved: 443 ...

  5. BZOJ2277[Poi2011]Strongbox——数论

    题目描述 Byteasar is a famous safe-cracker, who renounced his criminal activity and got into testing and ...

  6. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special Judge Submit: 383  Solve ...

  7. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  8. bzoj 2528: [Poi2011]Periodicity【kmp+构造】

    神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ #include<iostr ...

  9. bzoj 2527: [Poi2011]Meteors

    昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的. (这里n,m,k我就不区分了) 首先一个城市的询问可以很容易的二分 check用树状数组维护区间(区间修改,单点查询的那种) 一次是\(O(n ...

最新文章

  1. tf.get_variable
  2. expect--自动批量分发公钥脚本
  3. 服务器安装centos5.5下安装samba服务器以及windows访问samba服务器
  4. 【Groovy】Groovy 方法调用 ( 使用 对象名.@成员名 访问 Groovy 对象成员 )
  5. Java实现算法导论中快速傅里叶变换FFT递归算法
  6. Windows环境下node.js的安装和配置
  7. matplotlib 横坐标只显示整数_matplotlib初学:这样画折线图和添加标注、箭头
  8. mysql 脚本 linux_MySQL的一些功能实用的Linux shell脚本分享
  9. 访问Web服务器时 使用的协议是,使用SOAP协议访问Web服务
  10. android startanimation 回调,ScheduledThreadPoolExecutor执行莫名停止问题Android几个动画回调运行线程...
  11. css透明度的设置 (兼容所有浏览器)
  12. win7 mysql8.0.11安装教程_mysql8.0.13下载与安装图文教程(示例代码)
  13. 【渝粤题库】陕西师范大学209019 鲁迅研究 作业(专升本)
  14. **MA2灯光控台的TIMECODE 说明**
  15. 【硬刚大数据】从零到大数据专家之Apache Doris篇
  16. 腾讯云开发者实验室是什么?如何学习其中的153个实验案例?
  17. 硬件产品的成本构成——研发、产品边际成本和服务
  18. NetworkManager和network
  19. 测试每秒点击速度的软件,测试点击速度
  20. 《中国化工贸易》征稿函

热门文章

  1. 并联四足机器人项目开源教程(三)--- 使用webots搭建仿真环境
  2. IP分片和TCP分段解析--之IP分片
  3. 别轻易自责,专注力和自制力是稀缺资源
  4. ZZULI - 建国的数学难题
  5. 乌云飘散后,一群白帽子这样成长
  6. Python实现NBA文字直播间
  7. 利用c语言中printf输出图形
  8. vue中的路由守卫(导航守卫)
  9. Tomcat中CATALINA_HOME和CATALINA_BASE的区别
  10. Perceptron(感知机与径向基)