P05509. 寻找循环节

发布时间 2023-09-25 18:11:55作者: 我微笑不代表我快乐

 

Description
f[1]=1

f[2]=1

f[3]=(f[2]+f[1])%mod

f[i]=(f[i-1]+f[i-2])%mod;

1<mod<=100000

输出循环节长度

某一个起向右进行到某一个止的一节序列出现,首尾衔接,这一节序列称为循环节

Format
Input
mod的值

Output
循环节长度

Samples
输入数据 1
2
输出数据 1
3

提示 1 1 0 1 1 0 所以循环节是3

 

#include<bits/stdc++.h>
using namespace std;
int mod,f[10000010];
struct node
{
int a,b; 
friend bool operator <(node xx,node yy)
{
	      
    if(xx.a==yy.a)
	     return xx.b<yy.b;
    else
	   	return xx.a<yy.a;
    
}//得判全不然map认为两个元素相等 

};
map<node,int> mp;
node temp;
int main() 
{
	cin>>mod;
	mp[{1,1}]=1;
	f[1]=1,f[2]=1;
	for(int i=3;; i++) 
	{
		f[i]=(f[i-1]+f[i-2])%mod;
		temp.a=f[i-1];
		temp.b=f[i];
		if(mp[temp]!=0) 
		{
			cout<<i-mp[temp]-1<<endl;
			return 0;
		}
		mp[temp]=i-1;
	}
}