Hash Perfectly UESTC

来源:互联网 发布:java jdbc mysql 编辑:程序博客网 时间:2024/05/23 02:13

题目链接点这里


若,,a,和b在k的模下冲突。。显然(a-b)%k=0;

所以我们可以算出所以2个数之间的差的个数,,,

a-b。。可以转化为a+p-b

就是a和p-b求卷积就可以利用FFT了

在这里,,我们可以将p定位最大的那个数,,,,p-b表现结果为。。,就是将一个数组倒转,然后进行FFT


#include<algorithm>#include<iostream>#include<stdio.h>#include<cstring>#include<cmath>using namespace std;#define mem(x,y) memset(x,y,sizeof(x))#define FIN freopen("input.txt","r",stdin)#define fuck(x) cout<<x<<endlconst double eps=1e-7;const int MX=8e5+5;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3ftypedef long long LL;typedef pair<LL,LL> PLL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int n,m,maxn;const double pi = acos(-1.0);int len,mx;LL res[MX];struct Complex{    double r,i;    Complex(double r=0,double i=0):r(r),i(i) {};    Complex operator+(const Complex &rhs)    {        return Complex(r + rhs.r,i + rhs.i);    } Complex operator-(const Complex &rhs)    {        return Complex(r - rhs.r,i - rhs.i);    } Complex operator*(const Complex &rhs)    {        return Complex(r*rhs.r - i*rhs.i,i*rhs.r + r*rhs.i);    }} va[MX],vb[MX];void rader(Complex F[],int len){    int j = len >> 1;    for(int i = 1; i < len - 1; ++i)    {        if(i < j) swap(F[i],F[j]);        int k = len>>1;        while(j>=k)        {            j -= k;            k >>= 1;        }        if(j < k) j += k;    }}void FFT(Complex F[],int len,int t){    rader(F,len);    for(int h=2; h<=len; h<<=1)    {        Complex wn(cos(-t*2*pi/h),sin(-t*2*pi/h));        for(int j=0; j<len; j+=h)        {            Complex E(1,0);            for(int k=j; k<j+h/2; ++k)            {                Complex u = F[k];                Complex v = E*F[k+h/2];                F[k] = u+v;                F[k+h/2] = u-v;                E=E*wn;            }        }    }    if(t==-1) for(int i=0; i<len; ++i) F[i].r/=len;}void Conv(Complex a[],Complex b[],int len){    FFT(a,len,1);    FFT(b,len,1);    for(int i=0; i<len; ++i) a[i] = a[i]*b[i];    FFT(a,len,-1);}int gao(){    len=1;    while(len<=mx)len<<=1;    Conv(va,vb,len);    for(int i=0; i<len; ++i)res[i]=va[i].r + 0.5;    for(int i=0; i<=maxn; i++)res[i]=res[i+maxn];    double minn=INFLL;    int ans;    for(int i=1; i<=m; i++)    {        double t=0;        for(int j=i; j<=maxn; j+=i)t+=res[j];        if(t<minn) minn=t,ans=i;    }    return ans;}int main(){    while(cin>>n>>m)    {        mem(va,0);        mem(vb,0);        maxn=0;        for(int i=0; i<n; i++)        {            int x;            scanf("%d",&x);            maxn=max(maxn,x);            va[x].r++;        }        for(int i=0; i<=maxn; i++) vb[maxn-i].r=va[i].r;        mx=2*maxn+1;        printf("%d\n",gao());    }    return 0;}



0 0
原创粉丝点击