首页 技术 正文
技术 2022年11月7日
0 收藏 892 点赞 1,019 浏览 1465 个字

考试的时候想到了矩阵快速幂+快速幂,但是忘(bu)了(hui)欧拉定理。

然后gg了35分。

题目显而易见,让求一个数的幂,幂是斐波那契数列里的一项,考虑到斐波那契也很大,所以我们就需要欧拉定理了

p是素数,所以可以搞 [bzoj 1409] Password 矩阵快速幂+欧拉函数

然后我们用矩阵快速幂求出幂,然后快速幂即可解决问题

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;#define pos(i,a,b) for(int i=(a);i<=(b);i++)#define Ma 50000#define LL long longLL prime[Ma],num_prime;LL isnotprime[Ma]={1,1};LL c,ou;LL m,p,n,q;struct matrix{    LL a[10][10];    matrix(){        memset(a,0,sizeof(a));    }};matrix mul(matrix aa,matrix b){    matrix c;    pos(i,0,1){        pos(j,0,1){            c.a[i][j]=0;            pos(k,0,1){                c.a[i][j]=(c.a[i][j]+aa.a[i][k]*b.a[k][j])%ou;            }        }    }    return c;}void getprime(){    pos(i,2,Ma-1){        if(!isnotprime[i]){            prime[num_prime++]=i;        }        for(int j=0;j<num_prime&&i*prime[j]<Ma;j++){            isnotprime[i*prime[j]]=1;            if(!(i%prime[j])){                c++;                break;            }        }    }}matrix init(){    matrix res;    pos(i,0,1){        pos(j,0,1)            res.a[i][j]=(i==j);    }    return res;}matrix ks(matrix aa,int k){    matrix res=init();    while(k){        if(k&1)          res=mul(res,aa);        k>>=1;        aa=mul(aa,aa);    }    return res;}LL oula(LL nn){    LL mm=(int)sqrt(nn+0.5);    LL an=nn;    for(int i=0;prime[i]<=mm;i++){        if(nn%prime[i]==0){            an=an/prime[i]*(prime[i]-1);            while(nn%prime[i]==0)               nn/=prime[i];        }    }    if(nn>1)      an=an/nn*(nn-1);      return an;}LL qpow(LL a,LL k,LL c){    LL an=1;    a=a%c;    while(k){        if(k&1){            an=(an*a)%c;        }        k>>=1;        a=(a*a)%c;    }    return an;}LL ans;int main(){    getprime();    scanf("%lld%lld",&m,&p);    while(m--){        ans=0;        scanf("%lld%lld",&n,&q);        ou=oula(q);        matrix A;        A.a[0][0]=1;        A.a[0][1]=1;        A.a[1][0]=1;        A.a[1][1]=0;        matrix res=ks(A,n-1);        LL tmp=res.a[0][0];        //cout<<"ou="<<ou<<"  tmp="<<tmp<<endl;        ans=qpow(p,tmp,q)%q;        printf("%lld\n",ans);    }    return 0;}

  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,030
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,147
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,859