UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)

巨大的斐波那契数!

题目大意:斐波那契数列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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值