首页 > 代码库 > HDU 5895 Mathematician QSC
HDU 5895 Mathematician QSC
题目地址
欧拉函数+矩阵快速幂
1 #include<cstdio> 2 #include<algorithm> 3 #include<string.h> 4 #include<queue> 5 #define LL long long 6 using namespace std; 7 const int Nmax=10; 8 LL n,y,x,s,tmp; 9 int mod; 10 int oula_mod; 11 12 struct Matrix 13 { 14 int n,m; 15 long long map[Nmax][Nmax]; 16 Matrix(int x,int y) 17 { 18 n=x;m=y; 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=m;j++) 21 map[i][j]=0; 22 } 23 Matrix operator * (const Matrix b) 24 { 25 Matrix c(n,b.m); 26 if(m==b.n) 27 { 28 for(int i=1;i<=c.n;i++) 29 for(int j=1;j<=c.m;j++) 30 for(int k=1;k<=m;k++) 31 c.map[i][j]=(c.map[i][j]+(map[i][k]*b.map[k][j])%oula_mod)%oula_mod; 32 return c; 33 } 34 printf("error!!!!!!!!!!!!!!\n"); 35 } 36 }; 37 38 39 int oula(int n) 40 { 41 int ret=1,i; 42 for(i=2;i*i<=n;i++) 43 { 44 if(n%i==0) 45 { 46 n/=i,ret*=i-1; 47 while(n%i==0) n/=i,ret*=i; 48 } 49 } 50 if(n>1) ret*=n-1; 51 return ret; 52 } 53 54 55 56 57 Matrix get(long long n) 58 { 59 Matrix base(4,4); 60 base.map[1][1]=1;base.map[1][2]=1;base.map[1][3]=0;base.map[1][4]=0; 61 base.map[2][1]=0;base.map[2][2]=4;base.map[2][3]=1;base.map[2][4]=4; 62 base.map[3][1]=0;base.map[3][2]=1;base.map[3][3]=0;base.map[3][4]=0; 63 base.map[4][1]=0;base.map[4][2]=2;base.map[4][3]=0;base.map[4][4]=1; 64 Matrix ans(4,4); 65 for(int i=1;i<=ans.n;i++) 66 ans.map[i][i]=1; 67 68 while(n>0) 69 { 70 if(n & 1) 71 ans=ans*base; 72 base=base*base; 73 n>>=1; 74 } 75 76 return ans; 77 } 78 79 long long get_ans(long long times) 80 { 81 long long ans=1; 82 long long base=x; 83 while(times>0) 84 { 85 if(times & 1) 86 ans=(ans*base)%mod; 87 base=(base*base)%mod; 88 times>>=1; 89 } 90 return ans; 91 } 92 93 94 int main() 95 { 96 97 int t; 98 scanf("%d",&t); 99 while(t--)100 {101 scanf("%lld%lld%lld%lld",&n,&y,&x,&s);102 mod=s+1;103 oula_mod=oula(mod);104 //printf("oula_mod:%d\n",oula_mod);105 Matrix base(4,1);106 base.map[1][1]=0;107 base.map[2][1]=1;108 base.map[3][1]=0;109 base.map[4][1]=0;110 Matrix ans=get(n*y)*base;111 long long mi=ans.map[1][1]+oula_mod;112 //printf("mi:%lld\n",mi );113 //continue;114 printf("%lld\n",get_ans(mi));115 }116 return 0;117 }
HDU 5895 Mathematician QSC
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。