uva11582(模算数)

来源:互联网 发布:初学c语言 编辑:程序博客网 时间:2024/05/16 18:44

题目大意:

1.f(0) = 0 and f(1) = 1• 

2.f(i + 2) = f(i + 1) + f(i)(i>=0)

现在给出a,b,n,求f(a^b)除以n的余数。


题目分析:

这个题目的关键就是要知道这个序列(f[i]%n)是有循环节的。


代码:

#include <iostream>#include <vector>using namespace std;typedef unsigned long long LL;LL a,b,c;vector<LL>v;LL cal(){    v.clear();    v.push_back(0);v.push_back(1);    int flag=0;    for(int i=2;;i++){        LL ans=(v[i-1]%c+v[i-2]%c)%c;        if(ans==0){            flag=1;        }        if(ans==1){            if(flag==1){                return (LL)v.size()-1;            }        } else if(ans){            flag=0;        }        v.push_back(ans);    }}LL poww_add(LL a,LL b,LL mod){    LL ans=0;    while(b)    {        if(b&1) ans=(ans%mod+a%mod)%mod;        b>>=1;        a=(a%mod+a%mod)%mod;    }    return ans;}LL poww_mul(LL a,LL b,LL mod){    LL ans=1;    while(b)    {        if(b&1) ans=poww_add(ans,a,mod)%mod;        b>>=1;        a=poww_add(a,a,mod)%mod;    }    return ans;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int T;    cin>>T;    while(T--)    {        cin>>a>>b>>c;        if(c==1){            cout<<0<<endl;            continue;        }        LL mod=cal();        LL pos=poww_mul(a,b,mod);        cout<<v[pos]<<endl;    }    return 0;}


原创粉丝点击