巨大的斐波那契数!
题目大意:斐波那契数列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; }
时间: 2024-10-28 21:08:35