2021牛客多校 Hash Function(fft)
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021牛客多校 Hash Function(fft)相关的知识,希望对你有一定的参考价值。
Hash Function
题意:给出数组,求最小的mod使得 每个数取模后都不同。
思路:a%p=b%p 等价于 (a-b)%p=0 ,所以p不能为数组中任意两个数的差 ,假设我们现在知道了存在哪些差值,那么我们可以枚举倍数的方法求最小的p,
求所有差值可以用fft ,可以转化为(xa1+xa2+xa3+……+xan)*(x-a1+x-a2+x-a3+……+x-an) 系数大于0的那个指数就是存在的差值
负数可以加个500001;
#include<bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=2e18+100;
const int maxn=(int)1e6+10000;
const double PI=acos(-1);
int len=1;
int rev[maxn<<1];
int a[maxn],cnt[maxn];
struct comple
double x;
double y;
comple(double x=0,double y=0):x(x),y(y)
comple operator + (const comple b)const
return comple(x+b.x,y+b.y);
comple operator - (const comple b)const
return comple(x-b.x,y-b.y);
comple operator * (const comple b)const
comple ans;
ans.x=x*b.x-y*b.y;
ans.y=x*b.y+y*b.x;
return ans;
c[maxn<<1],b[maxn<<1];
void change(comple f[])
for(int i=0; i<len; i++)
rev[i]=rev[i>>1]>>1;
if(i&1)rev[i]|=len>>1;
for(int i=0; i<len; i++)
if(i<rev[i])//保证只交换一次
swap(f[i],f[rev[i]]);
void fft(comple f[],int op)
change(f);
for(int h=2; h<=len; h<<=1)
comple wncos(2*PI/h),sin(op*2*PI/h);
for(int j=0; j<len; j+=h)
comple w1,0;
for(int k=j; k<j+h/2; k++)
comple u=f[k];
comple v=w*f[k+h/2];
f[k]=u+v;
f[k+h/2]=u-v;
w=w*wn;
if(op==-1)
for(int i=0; i<len; i++)
f[i].x=f[i].x/len+0.5;
signed main()
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
b[a[i]].x=1;
c[500001-a[i]].x=1;
while(len<1000001) len<<=1;
fft(b,1);
fft(c,1);
for(int i=0;i<len;i++) b[i]=b[i]*c[i];
fft(b,-1);
for(int i=0;i<=len;i++)
if((int)b[i].x>0)
cnt[abs(500001-i)]=1;
for(int i=n;;i++)
bool fg=1;
for(int j=i;j<=500001;j+=i)
if(cnt[j])
fg=0;break;
if(fg)
cout<<i<<"\\n";
return 0;
以上是关于2021牛客多校 Hash Function(fft)的主要内容,如果未能解决你的问题,请参考以下文章
[Nowcoder] Browser Games-2021牛客多校10-A | Hash /压缩Trie