UVA11582 幂取模,快速幂

来源:互联网 发布:网络机房整改目的 编辑:程序博客网 时间:2024/06/07 07:35

题意:输入两个非负整数a,b和正整数n(0<=a,b<2^66,1<=n<=1000),计算f(a^b)%n的余数,其中f(x)为斐波那契数;

思路:因为每一次求的都是模n的余数,不妨设F(x)=f(x)%n,又因为是取余,F(x)肯定存在周期T;所以只需要计算出F(0)~F(0+T-1),然后算出F(a^b)属于其中的位置就可以了;

#include<iostream>#include<cmath>#include<stdio.h>#include<cstring>#include<algorithm>#include<map>using namespace std;typedef unsigned long long ull;int s[1100][6600],g[1100];/*数组s[A][B]是用来记录当n为A时的F(x),数组g[x]记录当n为x时的周期*/int pow_mod(ull a,ull b,int n){    if(b==0) return 1;    int x=pow_mod(a,b/2,n);    x=x*x%n;    if(b%2==1) x=x*a%n;    return x;}int main(){    ull a,b;    for(int i=2;i<=1000;i++)    {        s[i][0]=0;        s[i][1]=1;        for(int j=2;;j++)        {            s[i][j]=(s[i][j-1]+s[i][j-2])% i;            if(s[i][j-1]==0&&s[i][j]==1)            {                g[i]=j-1;                break;            }        }    }    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%llu %llu %d",&a,&b,&n);        if(a==0||n==1)        {            printf("0\n");        }        else {            int p=pow_mod(a%g[n],b,g[n]);            printf("%d\n",s[n][p]);        }    }    return 0;}

数论刚起步,如有错误还望指出,谢谢;

0 0