Hash Function

Hash Function

文章目录

    • 题意:
    • 题解:
    • 代码
      • NTT代码
      • FFT代码

题意:

给定n个互不相同的数,找一个最小的模域,使得它们在这个模域下互不相同。n<=5e5

题解:

考虑两个数a和b,a与b模m余数相同,当且仅当|a-b|能被m整除。
这样问题就转化成找到一个最下的m,使得m不是任意一个|ai-aj|约数(不会被m整除)
n<=5e5,所以直接暴力n2肯定不行
这时就要用到FFT/NTT加速
算N个数两两之差当然用FFT,利用多项式相乘即指数相加来做,(加减用指数,相乘用系数)
刚接触FFT的同学可能不明白,减法怎么用?FFT的模板不是乘法吗?
我们这样想:FFT可以快速求两个多项式的乘积,并求出每个指数所对应的系数,两个数相乘,指数相加,也就是如果我有一个多项式的指数为x,y(对应的系数都为1),另一个多项式的指数为z,w(对应的系数都为1),相乘后会得到指数为x+z,x+w,z+y,y+w,那如果我们将z和w分别为-x,-y,那就会得到x-x,x-y,y-x,y-y,这不正是x和y任意两数的差,该差是否存在就看他们的系数是否为1
这样就在N*logN求出所有差,(注意FFT中是没有指数为负的,所有我们加入一个偏移量MAX,让MAX-x,最后得到结果再加回去就行)
回到本题,要求是求最小的m,不是任意两数差的约数。现在我们求出所有的差并标记,然后枚举这个m,如果这个m的倍数均没有被标记,输出m
所以这算是个模板题了,会使用FFT/NTT板子

代码

NTT代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+100;
const int mx=5e5;
const int mod=998244353;
namespace IO{template<typename T>void write(T x){if(x<0){putchar('-');x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');}template<typename T> void read(T &x){x = 0;char ch = getchar();int f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+(ch-'0');ch=getchar();}x*=f;}
};
namespace Math{ll w;const int p=::mod;struct complex{ll real,imag;complex(ll a=0,ll b=0){real=a;imag=b;}friend complex operator*(const complex&a,const complex&b){complex ans;ans.real=((a.real*b.real%p+a.imag*b.imag%p*w%p)%p+p)%p;ans.imag=((a.real*b.imag%p+a.imag*b.real%p)%p+p)%p;return ans;}};ll x1,x2;ll ksm(ll a,ll b,ll p){ll ans=1;while(b){if(b&1) ans=(ans*a)%p;a=(a*a)%p;b>>=1;}return ans;}ll ksm(complex a,ll b,ll p){complex ans(1,0);while(b){if(b&1) ans=ans*a;a=a*a;b>>=1;}return ans.real%p;}bool Cipolla(ll n,ll&x0,ll&x1){n%=p;if(ksm(n,(p-1)>>1,p)==p-1) return false;ll a;while(true){a=rand()%p;w=((a*a%p-n)%p+p)%p;if(ksm(w,(p-1)>>1,p)==p-1) break;}complex x(a,1);x0=(ksm(x,(p+1)>>1,p)+p)%p;x1=(p-x0+p)%p;return true;}
};namespace NTT{#define mul(x,y) ((1ll*x*y>=mod?x*y%mod:1ll*x*y))#define dec(x,y) (1ll*x-y<0?1ll*x-y+mod:1ll*x-y)#define add(x,y) (1ll*x+y>=mod?1ll*x+y-mod:1ll*x+y)#define ck(x) (x>=mod?x-mod:x)typedef vector<int> Poly;int ksm(int a,int n,int mod=::mod){int res=1;while(n){if(n&1)res=1ll*res*a%mod;a=1ll*a*a%mod;n>>=1;}return res;}const int img=86583718;const int g=3,INV=ksm(g,mod-2);const int mx=21;int R[maxn<<2],deer[2][mx][maxn<<2],inv[maxn<<2];void init(const int t) {for(int p = 1; p <= t; ++ p) {int buf1 = ksm(g, (mod - 1) / (1 << p));int buf0 = ksm(INV, (mod - 1) / (1 << p));deer[0][p][0] = deer[1][p][0] = 1;for(int i = 1; i < (1 << p); ++ i) {deer[0][p][i] = 1ll * deer[0][p][i - 1] * buf0 % mod;deer[1][p][i] = 1ll * deer[1][p][i - 1] * buf1 % mod;}}inv[1] = 1;for(int i = 2; i <= (1 << t); ++ i)inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;}int NTT_init(int n) {int lim = 1, l = 0;while(lim < n) lim <<= 1, l ++ ;for(int i = 0; i < lim; ++ i)R[i] = (R[i >> 1] >> 1) | ((i & 1) << (l - 1));return lim;}void ntt(Poly &A, int type, int lim) {A.resize(lim);for(int i = 0; i < lim; ++ i)if(i < R[i])swap(A[i], A[R[i]]);for(int mid = 2, j = 1; mid <= lim; mid <<= 1, ++ j) {int len = mid >> 1;for(int pos = 0; pos < lim; pos += mid) {int *wn = deer[type][j];for(int i = pos; i < pos + len; ++ i, ++ wn) {int tmp = 1ll * (*wn) * A[i + len] % mod;A[i + len] = ck(A[i] - tmp + mod);A[i] = ck(A[i] + tmp);}}}if(type == 0) {for(int i = 0; i < lim; ++ i)A[i] = 1ll * A[i] * inv[lim] % mod;}}Poly poly_mul(Poly A, Poly B) {int deg = A.size() + B.size() - 1;int limit = NTT_init(deg);Poly C(limit);ntt(A, 1, limit);ntt(B, 1, limit);for(int i = 0; i < limit; ++ i)C[i] = 1ll * A[i] * B[i] % mod;ntt(C, 0, limit);C.resize(deg);return C;}Poly poly_inv(Poly &f, int deg) {if(deg == 1)return Poly(1, ksm(f[0], mod - 2));Poly A(f.begin(), f.begin() + deg);Poly B = poly_inv(f, (deg + 1) >> 1);int limit = NTT_init(deg << 1);ntt(A, 1, limit), ntt(B, 1, limit);for(int i = 0; i < limit; ++ i)A[i] = B[i] * (2 - 1ll * A[i] * B[i] % mod + mod) % mod;ntt(A, 0, limit);A.resize(deg);return A;}Poly poly_idev(Poly f) {int n = f.size();for(int i = n - 1; i-1>=0 ; -- i) f[i] = 1ll * f[i - 1] * inv[i] % mod;f[0] = 0;return f;}Poly poly_dev(Poly f) {int n = f.size();for(int i = 1; i < n; ++ i) f[i - 1] = 1ll * f[i] * i % mod;f.resize(n - 1);return f;}Poly poly_ln(Poly f, int deg) {Poly A = poly_idev(poly_mul(poly_dev(f), poly_inv(f, deg)));return A.resize(deg), A;}Poly poly_exp(Poly &f, int deg) {//cerr<<deg<<endl;if(deg == 1)return Poly(1, 1);Poly B = poly_exp(f, (deg + 1) >> 1);B.resize(deg);Poly lnB = poly_ln(B, deg);for(int i = 0; i < deg; ++ i)lnB[i] = ck(f[i] - lnB[i] + mod);int limit = NTT_init(deg << 1);ntt(B, 1, limit), ntt(lnB, 1, limit);for(int i = 0; i < limit; ++ i)B[i] = 1ll * B[i] * (1 + lnB[i]) % mod;ntt(B, 0, limit);B.resize(deg);return B;}Poly poly_pow(Poly&f,int k){f=poly_ln(f,f.size());for(auto&x:f)x=1ll*x*k%mod;return poly_exp(f,f.size());}Poly power(Poly f,int k1,int k2,int deg){int s=0;while(f[s]==0&&s<f.size())++s;if(1ll*s*k1>=deg){return vector<int>(deg);}int Inv=ksm(f[s],mod-2,mod);int Mul=ksm(f[s],k2);deg-=s;for(int i=0;i<deg;++i)f[i]=f[i+s];f.resize(deg);for(int i=0;i<deg;++i)f[i]=1ll*f[i]*Inv%mod;auto res1=poly_ln(f,deg);for(int i=0;i<res1.size();++i)res1[i]=1ll*res1[i]*k1%mod;auto res2=poly_exp(res1,deg);for(int i=0;i<deg;++i)res2[i]=1ll*res2[i]*Mul%mod;deg+=s;int now=s*k1;Poly res;res.resize(deg);for(int i=deg-1;i>=now;--i)res[i]=res2[i-now];for(int i=now-1;i>=0;--i)res[i]=0;return res;}Poly Poly_Sqrt(Poly&f,int deg){if(deg==1)return Poly(1,1);Poly A(f.begin(),f.begin()+deg);Poly B=Poly_Sqrt(f,(deg+1)>>1);Poly IB=poly_inv(B,deg);int lim=NTT_init(deg<<1);ntt(A,1,lim),ntt(IB,1,lim);for(int i=0;i<lim;++i){A[i]=1ll*A[i]*IB[i]%mod;}ntt(A,0,lim);for(int i=0;i<deg;++i){A[i]=(1ll*A[i]+B[i])%mod*inv[2]%mod;}A.resize(deg);return A;}Poly Sqrt(Poly&f,int deg){const int Pow=ksm(2,mod-2);int k1=1;if(f[0]!=1){k1=ksm(f[0],mod-2);for(int i=1;i<f.size();++i){f[i]=1ll*k1*f[i]%mod;}ll x0,x1;assert(Math::Cipolla(f[0],x0,x1));k1=min(x1,x0);f[0]=1;}auto Ln=poly_ln(f,deg);for(int i=0;i<f.size();++i){Ln[i]=1ll*Ln[i]*Pow%mod;}auto Exp=poly_exp(Ln,deg);for(int i=0;i<Exp.size();++i)Exp[i]=1ll*Exp[i]*k1%mod;return Exp;}Poly poly_sin(Poly&f,int deg){Poly A(f.begin(),f.begin()+deg);Poly B(deg),C(deg);for(int i=0;i<deg;++i){A[i]=1ll*A[i]*img%mod;}B=poly_exp(A,deg);C=poly_inv(B,deg);const int inv2i=ksm(img<<1,mod-2);for(int i=0;i<deg;++i){A[i]=1ll*(1ll*B[i]-C[i]+mod)%mod*inv2i%mod;}return A;}Poly poly_cos(Poly&f,int deg){Poly A(f.begin(),f.begin()+deg);Poly B(deg),C(deg);for(int i=0;i<deg;++i){A[i]=1ll*A[i]*img%mod;}B=poly_exp(A,deg);C=poly_inv(B,deg);const int inv2=ksm(2,mod-2);for(int i=0;i<deg;++i){A[i]=(1ll*B[i]+C[i])%mod*inv2%mod;}return A;}Poly poly_arcsin(Poly f,int deg){Poly A(f.size()),B(f.size()),C(f.size());A=poly_dev(f);B=poly_mul(f,f);for(int i=0;i<deg;++i){B[i]=dec(mod,B[i]);}B[0]=add(B[0],1);C=Poly_Sqrt(B,deg);C=poly_inv(C,deg);C=poly_mul(A,C);C=poly_idev(C);return C;}Poly poly_arctan(Poly f, int deg) {Poly A(f.size()), B(f.size()), C(f.size());A = poly_dev(f);B = poly_mul(f, f);B[0] = add(B[0], 1);C = poly_inv(B, deg);C = poly_mul(A, C);C = poly_idev(C);C.resize(deg);return C;}
};
using NTT::Poly;
using namespace IO;
int n,t;
Poly a,b;
bool vis[maxn];signed main(){//freopen("in.txt","r",stdin);//clock_t c1 = clock();NTT::init(NTT::mx-1);//for(auto x:tmp)cerr<<x<<" ";cerr<<endl;a.resize(maxn),b.resize(maxn);int n;read(n);if(n==1){cout<<1<<endl;return 0;}for(int i=0;i<n;++i){int x;read(x);a[x]=1;b[mx-x]=1;}auto res=NTT::poly_mul(a,b);for(int i=mx;i<=2*mx;++i){if(res[i]){vis[i-mx]=1;}}bool flag=0;for(int i=1;i<=mx+1;++i){int now=0;for(int j=i;j<=mx;j+=i){now|=(vis[j]!=0);if(now)break;}if(!now){cout<<i<<endl;flag=1;break;}}return 0;
}

FFT代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e6+50;
const double pi=acos(-1);
ll r[N],bits;
complex<double>A[N],B[N],w[N];
int dp[500005], vis[500005];
void FFT(complex<double> *P,ll op,ll N)
{for(ll i=1;i<N;i++){if(i>r[i])swap(P[i],P[r[i]]);}for(ll i=1;i<N;i<<=1){for(ll p=i<<1,j=0;j<N;j+=p){for(ll k=0;k<i;k++){complex<double>W=w[N/i*k];W.imag(W.imag()*op);complex<double> X=P[j+k],Y=W*P[j+k+i];P[j+k]=X+Y;P[j+k+i]=X-Y;}}}
}ll a[N],b[N],cnt[N];void solve(ll *a,ll *b,ll n,ll m)
{ll len;for(len=1,bits=0;len<=n+m;len<<=1)bits++;bits--;for(ll i=0;i<len;i++)A[i].real(0),A[i].imag(0),B[i].real(0),B[i].imag(0);for(ll i=0;i<=n;i++)A[i].real(a[i]);for(ll i=0;i<=m;i++)B[i].real(b[i]);for(ll i=0;i<len;i++)r[i]=(r[i>>1]>>1)|((i&1)<<bits);for(ll i=0;i<len;i++)w[i].real(cos(pi/len*i)),w[i].imag(sin(pi/len*i));FFT(A,1,len);FFT(B,1,len);for(ll i=0;i<len;i++)A[i]=A[i]*B[i];FFT(A,-1,len);for(ll i=0;i<=n+m;i++)a[i]=(ll)(A[i].real()/len+0.5);
}ll  hh[1500150];
ll cii=0;int main()
{ll n,m,k,x;scanf("%lld",&n);for(ll i=0;i<n;i++){scanf("%lld",&x);a[x]=1;b[500050-x]=1;}solve(a,b,500050,500050);//printf("a=%lld \n",a[1000]);for(ll i=0;i<=1000100;i++){if(a[i]!=0)hh[cii++]=abs(i-500050);}int Max=0;for(ll i=0;i<cii;i++){if(hh[i]>Max){Max=hh[i];}dp[hh[i]]=1;}int ans=Max+1;for(int i=Max;i>=n;i--){if(dp[i]==0){ans=i;continue;}if(vis[i]==1){continue;}for(int j=2;j*j<=i;j++){if(i%j==0){vis[j]=1;vis[i/j]=1;dp[j]=1;dp[i/j]=1;}}}printf("%d\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5321 [BJOI2019]送别(LCT)

Foreword\text{Foreword}Foreword 肝了一下午一晚上的码农题… &#xff08;主要就是在 debug&#xff0c;LCT 太难 de 了…&#xff09; 感谢 M_sea&#xff0c;在调无可调认为LCT会不会不可做时&#xff0c;我看到了他的题解&#xff0c;几乎一样的思路&#xff0c;给了我继…

WebApi网关之Bumblebee和Ocelot性能对比

Bumblebee是基于.net core 2.1开发的WebApi网关组件&#xff0c;由于Bumblebee所追求的轻量化和性能&#xff0c;所以它并没有像Ocelot那样从asp.net core上进行扩展&#xff1b;而是构建在BeetleX.FastHttpApi之上&#xff0c;主要原因BeetleX.FastHttpApi有着更轻量化和高性能…

【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

本题已自我实现。但仍归于无码专区 problem 求 ∑i1n−1i⨁(n−i)\sum_{i1}^{n-1}i\bigoplus (n-i)∑i1n−1​i⨁(n−i)。 20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤1050020\%,n\le 1e6;;50\%,n\le 1e9;;70\%,n\le 1e18;;100\%,n\le 10^{500}20%,n≤1e6;;50%,n≤1e9;;7…

模板:常系数齐次线性递推(线性代数、多项式)

所谓常系数齐次线性递推&#xff0c;就是系数为常数的齐次线性递推。 &#xff08;逃&#xff09; 前言 sto Asta orz&#xff01; 又是一个名字高大上&#xff0c;实则小清新的算法&#xff01; 解析 考虑一个 k 次的线性递推&#xff1a; an∑i1kfian−ia_n\sum_{i1}^kf_…

2021牛客暑期多校训练营1

2021牛客暑期多校训练营1 题号题目知识点难度AAlice and Bob博弈论BBall Dropping计算几何签到CCut the TreeDDetermine the Photo Position签到EEscape along Water PipeFFind 3-friendly Integers真签到GGame of Swapping Numbers思维题&#xff0c;推导HHash FunctionFFT&a…

【无码专区12】子集和(背包dp)

此题已自我实现&#xff0c;但仍归于无码专区 本题在考场上就过了&#xff0c;所以难度并不高&#xff0c;发现性质即可。 problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​&#xff0c;他们的和为 mmm。你想对于其每一个子集 SSS&#xff0c;求出他…

Penguins

Penguins 题意&#xff1a; 有两个20*20的地图&#xff0c;有障碍物&#xff0c;两个地图各有一个小人&#xff0c;左侧地图的小人要从右下角走到右上角&#xff0c;右侧地图的小人要从左下角走到左上角&#xff0c;这两个小人是镜像移动的&#xff0c; 左侧小人右侧小人左移…

盲盒(随机概率 + 最大公约数)

盲盒problemsolutioncodeproblem 有 2n2n2n 个盲盒&#xff0c;每个盲盒有一个惊喜值 aia_iai​。 打开恰好 nnn 个盲盒&#xff0c;获得的惊喜值为这些盲盒惊喜值的最大公约数。 求能获得的最大惊喜值。 n≤1e5,ai≤1e12n\le 1e5,a_i\le 1e12n≤1e5,ai​≤1e12。 solution…

P5354 [Ynoi2017] 由乃的 OJ(树剖、位运算)

前言 当暴力思路与题解中的“暴力”不同时&#xff0c;继续想优化往往就渐行渐远了… 所以当没有头绪时&#xff0c;要勇于跳出原有的转化&#xff01; 这种位运算类型的优化似乎始终不在我的寄存器中…需要加强&#xff01; 解析 不难想到按位考虑的 O(nklog⁡2n)O(nk\log…

在 .NET Core 中运行 JavaScript

一.前言在 .NET Framework 时&#xff0c;我们可以通过V8.NET等组件来运行 JavaScript&#xff0c;不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core &#xff0c;我们如何在 .NET Core 中运行 JavaScript 呢&#xff0c;答案是使用 NodeServices。关于为何有在 .N…

I love exam HDU - 6968

I love exam HDU - 6968 题意&#xff1a; 有n个考试科目&#xff0c;现在有m套复习资料&#xff0c;每套复习资料需要花费wi天使用&#xff0c;用完提升ci的分数&#xff0c;现在还有t天复习时间&#xff0c;挂科数目不能超过p&#xff0c;问所有达到的最大分数 题解&#…

[CF1442 D] Sum(分治优化dp + 结论)

CF1442D Sumproblemsolutioncodeproblem luogu翻译 solution 部分分做法&#xff0c;预处理每组前缀和&#xff0c;暴力背包 dpdpdp 转移&#xff1a;dpi,jmax⁡{dpi−1,j−ksumi(k)∣0≤k≤l[i]}dp_{i,j}\max\Big\{dp_{i-1,j-k}sum_i(k)\ \Big|\ 0\le k\le l[i]\Big\}dpi,j…

P4338 [ZJOI2018]历史(树剖)(暴力)

前言 有点懊恼的一个题… 并没有其他那些ZJOI那么毒瘤&#xff0c;看出了关键结论&#xff0c;但最后维护卡在log条虚边的伞兵性质上了。 解析 第一眼&#xff1a;感觉根本不可做啊。 冷静一下&#xff0c;既然它还变态的带修&#xff0c;一定是可以转化成比较形式化的东西的…

Named Volume 在 MySQL 数据持久化上的基本应用

原文作者&#xff1a;春哥非常感谢春哥的投稿&#xff0c;同时也有一些感慨。初识春哥时&#xff0c;春哥是美术设计大咖。后不久&#xff0c;创业并致力于游戏开发&#xff0c;已有3年。从Unity3D到IOS&#xff08;Swift&#xff09;开发&#xff0c;从前端开发到后端以及容器…

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2) 题号题目知识点AMean Inequality签到BI Hate 1111思维CPotions (Easy Version)思维C1Potions (Hard Version)思维DKill Anton思维逆序对EOolimry and Suffix ArrayFMedian Queries CF1526A Mean Inequality 题意&#xff1a; 给你一个序列a&…

[AtCoder Regular Contest 060] E - Tak and Hotels

AT2039 [ARC060C] 高橋君とホテル / Tak and Hotelsproblemsolution - 分块code - 分块solution - 倍增code - 倍增problem luogu翻译 solution - 分块 肯定刚开始&#xff0c;我们很想暴力跳过去。事件复杂度取决于数据。 肯定不做把头拿给别人砍的事 这种跳法&#xff0…

模板:珂朵莉树

所谓珂朵莉树&#xff0c;就是珂朵莉发明的树。 &#xff08;逃 前言 在数据随机且带区间推平操作时适用&#xff0c;此时所有操作的期望颜色段数都是 O(log⁡n)O(\log n)O(logn) 的&#xff0c;可以使用暴力解决即可。 暴力即优雅。 解析 利用 set 维护颜色段&#xff1a;…

.Netcore 2.0 Ocelot Api网关教程(7)- 限流

本文介绍Ocelot中的限流&#xff0c;限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单&#xff0c;只需要添加配置即可。1、添加限流修改 configuration.json 配置文件&#xff0c;对 UpstreamPathTemplate 为 /webapib/values 的配置修改如下&#xff1…

cf1526 C Potions

cf1526 C Potions 题意&#xff1a; n个药剂&#xff0c;每个药剂可以加/减能量&#xff0c;一开始能量为0&#xff0c;从左往右开始进行&#xff0c;全程能量不为负&#xff0c;问最多可以使用几个药剂 本题有简单(n<2000),困难模式(n≤200000) 题解&#xff1a; 简单题…

[CF 526 F] Pudding Monsters(单调栈 + 线段树)

CF526F Pudding Monstersproblemsolutioncodeproblem luogu翻译 solution observation &#xff1a;每行每列恰好有一个棋子&#xff0c;所以如果一段区间 [l,r][l,r][l,r] 会被某个 kkk 统计&#xff0c;当且仅当这个区间内棋子纵坐标 ymax−ymin1r−l1y_{max}-y_{min}1r-l…