题意
根据一个递推式不断求出元素,判断这个数出没出现过。
题解
以前只写过邻接表的哈希表,没写过链前的哈希表,贴一下代码。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N = 2e6+10,mod = 1e6+7;
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c>='0'&&c<='9')) ch=c,c=getchar();
while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
struct edge
{
int nxt,to;
}e[N];
ll a,b,c;
ll x[N];
ll mp[N];
int ecnt=-1,cnt,head[N];
inline void add(int x,int y)
{
e[++ecnt]=(edge){head[x],y};
head[x]=ecnt;
}
inline void insert(int x)
{
int u=x%mod;
mp[++cnt]=x;
add(u,cnt);
}
inline bool find(int x)
{
int u=x%mod;
for(int i=head[u];~i;i=e[i].nxt)
if(mp[e[i].to]==x) return 1;
return 0;
}
int main()
{
memset(head,-1,sizeof(head));
a=read(),b=read(),c=read();
x[0]=1;insert(1);
for(int i=1;i<=2e6;i++)
{
x[i]=(a*x[i-1]+x[i-1]%b)%c;
if(find(x[i])) {printf("%d",i);return 0;}
insert(x[i]);
}
printf("-1");
return 0;
}
标签:哈希,ybtoj,ll,long,链前,&&,代码 来源: https://www.cnblogs.com/conprour/p/15303103.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。