zoukankan      html  css  js  c++  java
  • BZOJ 2277 Poi2011 Strongbox

    题目大意:一个集合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 }

    二、

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

    日常写错……欢迎指正 QQ:2960005671 邮箱:bleavescoder@163.com
  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/BLeaves/p/8639190.html
Copyright © 2011-2022 走看看