11582 - Colossal Fibonacci Numbers!

来源:互联网 发布:网络自由与秩序申论 编辑:程序博客网 时间:2024/05/23 02:13

像刘汝佳书上说的,斐波那契数有一个叫尾数循环的性质:个位数是一个60步的循环,最后两位数是一个300步的循环。。。但是不会超过n^2;感兴趣的朋友可以查一查。

所以问题就变成了求a^b这个超大的数mod n等于多少,也就是所谓的幂取模利用递归,将大数分解取模;

但是要注意,0对任何数取模都是0,任何数对1取模都是0;

#include<bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int maxn = 1000000+10;int f[maxn],kase;int pow_mod(ULL a,ULL n,int 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 solve(ULL a,ULL b,int n) {    if(a==0||n==1) return 0;    for(int i=2;;i++){        f[i]=f[i-1]+f[i-2];        f[i]=f[i]%n;        if(f[i-1]==0&&f[i]==1) { kase=i-1;break; }    }    int v=pow_mod(a%kase,b,kase);    return f[v];}int main() {    int t,n;    ULL a,b;    scanf("%d",&t);    while(t--) {        cin>>a>>b>>n;        f[0]=0;        f[1]=1;        printf("%d\n",solve(a,b,n));    }    return 0;}


0 0
原创粉丝点击