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;
}
}