巨大的斐波那契数!
题目大意:斐波那契数列f[N],给你a,b,n,求f[a^b]%n.
思路:数论题。f[a^b]%n是有周期的,我们求出来这个周期后就可以将简化成f[(a%周期)^b]%周期运用分治法幂取模。
注意用unsigned long long(貌似是 long long的二倍),不然会溢出,又学了一招。。。
不知道哪的bug,一直改不对,一直,后来捡来别人的和自己一样的代码一改就对了,,,
#include<iostream>//UVA
#include<cstdio>
using namespace std;
typedef unsigned long long ull;//unsigned long long的范围是long long的二倍
const int N = 1100*1100;
int f[N];
int pow_mod(ull a,ull n,ull m)//分治法,幂取模
{
if(n==0) return 1;
ull x = pow_mod(a,n/2,m);
ull ans = (ull)x * x % m;
if(n%2==1) ans = ans*a%m;
return (int)ans;
}
int main()
{
int t,n;
ull a,b;
cin >> t;
while(t--)
{
cin >> a >> b >> n;
f[0] = 0, f[1] = 1%n;
int kase;
for(int i = 2; i <= n*n+100; i++)
{
f[i] = (f[i-1]+f[i-2]) % n;
if(f[i]==f[1] && f[i-1]==f[0])
{
kase = i - 1;
break;
}
}
int ans = pow_mod(a%kase, b,(ull)kase);
cout << f[ans] << endl;
}
return 0;
}