题目链接:点击查看

题目大意:给出一个长度为 nnn 的序列,现在要求找到一个 seedseedseed,使得所有数字变为 a[i]=a[i]modseeda[i]=a[i]\mod seeda[i]=a[i]modseed 后两两互不相同,找到最小的 seedseedseed

题目分析:考虑转换模型,如果存在着 iii 和 jjj 使得 a[i]≡a[j](modseed)a[i] \equiv a[j] \pmod {seed}a[i]≡a[j](modseed),那么肯定有 a[i]+k∗seed=a[j]a[i]+k*seed=a[j]a[i]+k∗seed=a[j],其中 kkk 为任意正整数,移项可得 a[i]−a[j]≡0(modseed)a[i]-a[j] \equiv 0 \pmod{seed}a[i]−a[j]≡0(modseed),到此模型转换为寻找到最小的正整数 mmm,其中不是任意一对 ∣a[i]−a[j]∣|a[i]-a[j]|∣a[i]−a[j]∣ 的约数。

直接按照项数枚举的话复杂度是 n2n^2n2 级别的,观察到值域是 [0,500000][0,500000][0,500000] 的,即 a[i],a[j]∈[0,500000]a[i],a[j] \in[0,500000]a[i],a[j]∈[0,500000],推得 ∣a[i]−a[j]∣∈[0,500000]|a[i]-a[j]|\in[0,500000]∣a[i]−a[j]∣∈[0,500000],因为本题中任意两项的值都互不相等,所以可以从值域入手,判断某个值是否存在,此时只需要枚举答案 seedseedseed,就可以在 O(nlogn)O(nlogn)O(nlogn) 的时间复杂度内检查答案是否合法。

我们将 a[i]=xa[i]=xa[i]=x 转换为 P[x]=1P[x]=1P[x]=1,令多项式 {P0,P1,...,P500000−1,P500000}\{ P_{0},P_{1},...,P_{500000-1},P_{500000} \}{P0​,P1​,...,P500000−1​,P500000​} 与 {P0,P−1,...,P−(500000−1),P−500000}\{ P_{0},P_{-1},...,P_{-(500000-1)},P_{-500000} \}{P0​,P−1​,...,P−(500000−1)​,P−500000​} 进行卷积,这样对于其中的 P[i]P[i]P[i] 和 P[j]P[j]P[j],卷积后得到 P[i+j]P[i+j]P[i+j],因为 jjj (下标)是负数,所以自然得到了所有的 Pi−jP_{i-j}Pi−j​

到此为止就可以用 ntt 或 fft 进行优化了,不过多项式卷积不支持负数,所以需要给会出现负数的位置增加一个偏移量 limitlimitlimit,令第二个多项式变为:{Plimit−0,Plimit−1,...,Plimit−(500000−1),Plimit−500000}\{ P_{limit-0},P_{limit-1},...,P_{limit-(500000-1)},P_{limit-500000} \}{Plimit−0​,Plimit−1​,...,Plimit−(500000−1)​,Plimit−500000​}

因为 ∣a[i]−a[j]∣∈[0,500000]|a[i]-a[j]|\in[0,500000]∣a[i]−a[j]∣∈[0,500000],所以最后枚举答案的范围是 [1,500001][1,500001][1,500001]

代码:

// Problem: Hash Function
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11166/H
// Memory Limit: 524288 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#include<complex>
#define cp complex < double >
#define lowbit(x) (x&-x)
using namespace std;
const double pi=acos(-1);
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;int lena=0,lenb=0,n,res[N<<2];cp F[N<<2],G[N<<2],arr[N<<2],inv[N<<2];void init()
{for (int i=0;i<n;i++){arr[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));inv[i]=conj(arr[i]);}
}
void FFT(cp *a,cp *arr)
{int lim=0;while ((1<<lim)<n) lim++;for (int i=0;i<n;i++){int t=0;for (int j=0;j<lim;j++)if ((i>>j) & 1) t|=1<<(lim-j-1);if (i<t) swap(a[i],a[t]);}for (int l=2;l<=n;l*=2){int m=l/2;for (cp *buf=a;buf!=a+n;buf+=l)for (int i=0;i<m;i++){cp t=arr[n/l*i]*buf[i+m];buf[i+m]=buf[i]-t;buf[i]+=t;}}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);lena=lenb=500000;read(n);for(int i=1;i<=n;i++) {int x;read(x);F[x].real(1);G[500000-x].real(1);}n=1;while(n<(lena+lenb))n<<=1;init();FFT(F,arr);FFT(G,arr);for(int i=0;i<n;i++)F[i]*=G[i];FFT(F,inv);for(int i=0;i<n;i++)res[i]=floor(F[i].real()/n+0.5);for(int i=1;i<=500001;i++) {bool flag=true;for(int j=500000+i;j<=1000000;j+=i) {if(res[j]) {flag=false;break;}}if(flag) {return 0*printf("%d\n",i);}}return 0;
}

2021牛客多校1 - Hash Function(思维+FFT)相关推荐

  1. 2021牛客第一场H.Hash Function—FFT求差值的卷

    https://ac.nowcoder.com/acm/contest/11166/H 官方题解. 比赛时,我们都是用暴力写的,数据太弱了,今天突然想起来,用fft写了一下. 主要使用fft求差值的卷 ...

  2. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  3. 【2021牛客多校2】F-Girlfriend 计算几何

    2021牛客多校2-F F-Girlfriend 题目大意 给出四个点 A , B , C , D A, B, C, D A,B,C,D 另有两点 P 1 , P 2 P_1, P_2 P1​,P2​ ...

  4. K-Stack 2021牛客多校2

    链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...

  5. 2021牛客多校第八场补题 D-OR

    链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...

  6. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

  7. FFT ---- 2021牛客多校第一场 H Hash Function

    题目链接 题目大意: 解题思路: 首先我们知道任意两个数%seed\%seed%seed都不相同→\rightarrow→(aj−ai)%seed≠0(∀ai≤aj)(a_j-a_i)\%seed\n ...

  8. 2021牛客多校9 - Cells(推公式+NTT)

    题目链接:点击查看 题目大意:初始时给出 nnn 个点,分别为 {(0,a0),(0,a1),⋯,(0,an)}\{(0,a_0),(0,a_1),\cdots,(0,a_n)\}{(0,a0​),( ...

  9. 2021牛客多校10 - Browser Games(哈希)

    题目链接:点击查看 题目大意:给出 nnn 个字符串,对于每个 iii ,输出最少需要用多少个前缀,可以表示第 1∼i1\sim i1∼i 个字符串而不能表示第 i+1∼ni+1\sim ni+1∼n ...

最新文章

  1. 实时卷积神经网络实现人脸检测和情感/性别分类
  2. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例
  3. NYOJ 661 亲亲串
  4. gtest 编译、安装和使用
  5. AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…
  6. 温度 数值模拟 matlab,西安交通大学——温度场数值模拟(matlab)
  7. Adobe Photoshop源代码以及3800万用户信息泄漏
  8. 百度富文本编辑器UEditor的使用
  9. 2022年认证杯SPSSPRO杯数学建模C题(第二阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
  10. Pygame详解(九):mixer 模块
  11. QT学习之QQ聊天案例
  12. 无线路由器怎么做一个家庭服务器,家庭路由器怎么做DHCP服务器
  13. WPTools改进了光标定位算法和RTF编写器
  14. java pdm 解析_java解析静态AIS原始数据
  15. 阿里云主机安全组端口开放完整教程
  16. [windows] 半开连接数
  17. [2002] PDOException in Connection.php line 295
  18. JavaScript进阶:如何写出优雅的JavaScript代码
  19. 基于单片机的智能手环系统设计
  20. 实验1 C++程序的运行环境

热门文章

  1. 别再说找不到Python练手项目了,这80个拿去过冬
  2. MySQL sql99语法介绍
  3. MySQL高级 全表扫描更快
  4. Nginx正向代理实现
  5. 为什么要用Dubbo-远程通信背景
  6. volatile 关键字是如何保证可见性的?
  7. Spring5的集成测试
  8. 用户操作-用户添加操作代码实现
  9. Zookeeper_简介
  10. Nginx_虚拟主机配置讲解