CF2023F
题目大意:给定n和k,求出斐波那契数列中第n个%k==0的数的下标
数学题,有两个结论
1.给定一个模数x,斐波那契数列中f[i]%x的值是循环的,并且循环节最多不超过6* x(证明感觉好麻烦,记住好了)
2.如果f[i]%x==0,那么对于任何一个i的倍数k,都有f[k]%x=0
有了以上结论后这题就秒了,暴力循环6k找存不存在k的倍数,如果存在直接*n
不过如果直接算fi的话会爆,有几种方法1:fi用来算对k的余数,而不存斐波那契数本身2.当fi大于k的时候就-k,这样在%k意义下fi的值是不变的
code
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=6e5+10;
const int mod=1e9+7;
int n,k;
int f[maxn];
void youlinaixu()
{
int n,k;
cin>>n>>k;
f[1]=1%k,f[2]=1%k;
for(int i=1;i<=6*k;i++)
{
if(i>=3)
{
f[i%3]=(f[(i+1)%3]+f[(i+2)%3])%k;
}
if(f[i%3]==0)
{
cout<<n%mod*i%mod<<endl;
return;
}
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--)
{
youlinaixu();
}
return 0;
}

浙公网安备 33010602011771号