http://poj.org/problem?id=2939
题意:某个人点到两次时这个人自杀,当某个人点到三次时,循环结束,求结束时剩余的人数;
#include<stdio.h>
#define inf 1000009
struct node
{
__int64 q;
int num;
int next;
}p[inf];
int link[inf],m;
void init()
{
for(int i=0;i<=inf;i++)
{
link[i]=0;
}
m=1;
}
int find(__int64 q,int x)
{
int i;
for(i=link[x];i>0;i=p[i].next)
{
if(q==p[i].q)
{
p[i].num++;
return p[i].num;
}
}
return 0;
}
void add(__int64 q,int x)
{
p[m].q=q;
p[m].num=1;
p[m].next=link[x];
link[x]=m++;
}
int main()
{
int n,a,b;
while(scanf("%d",&n),n)
{
scanf("%d%d",&a,&b);
init();
__int64 x=b%n;
int ans = 0;
while(1)
{
int temp=find(x,x%inf);
if(temp==0)
add(x,x%inf);
else
if(temp==2)ans++;
else if(temp==3)break;
x=(((a*x)%n*x)%n+b)%n;
}
printf("%d\n",n-ans);
}
}