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;
}
posted @ 2025-05-20 11:15  miku今天吃什么  阅读(12)  评论(0)    收藏  举报