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
- Hash Perfectly UESTC
- CDOJ 1314 Hash Perfectly
- CDOJ 1314 Hash Perfectly(FFT,计数)
- Perfectly Lonely
- (CDOJ) UESTC 606 Palindrome Again 后缀数组二分 + Manacher + Hash
- bfs,hash,康托展开(UESTC 485,Game)
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- LeetCode086 Partition List
- 469.等价二叉树
- 程序的预编译,编译,汇编,链接过程
- JAVA求学之路重写Converter
- windows文件及目录常用操作命令
- Hash Perfectly UESTC
- 在有生之年,还能看到哪些改变世界的黑科技产品?
- 51Nod-1562-玻璃切割
- LeetCode087 Scramble String
- Android 应用程序数据持久化方法
- 【SDOI2017】硬币游戏
- Oracle 如何合并某字段的值
- qnx的ssh功能配置,nfs配置,scp配置,telnet配置
- 第四章预习