HDU 5690 矩阵快速幂
Posted 半根毛线code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5690 矩阵快速幂相关的知识,希望对你有一定的参考价值。
All X
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 889 Accepted Submission(s): 425
Problem Description
F(x,m)
代表一个全是由数字x
组成的m
位数字。请计算,以下式子是否成立:
F(x,m) mod k ≡ c
F(x,m) mod k ≡ c
Input
第一行一个整数T
,表示T
组数据。
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤1010
0≤c<k≤10,000
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤1010
0≤c<k≤10,000
Output
对于每组数据,输出两行:
第一行输出:"Case #i:"。i 代表第i 组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
第一行输出:"Case #i:"。i 代表第i 组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
Sample Input
3
1 3 5 2
1 3 5 1
3 5 99 69
Sample Output
Case #1:
No
Case #2:
Yes
Case #3:
Yes
Hint
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
Source
题意:中文题意
题解:构造矩阵
10 ,0 xx , xx 10*xx+1*xx , xx
1 ,1 * 0 ,0 = 0 , 0
m[0][0]为结果
在矩阵构造方面 还是好菜的 之前构造的 一直wa
常系数矩阵中不能有未知数!!!
matrix_quick(x,m-1); m-1次幂
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 #include<stack> 6 #include<map> 7 #define mod 10000 8 #define ll __int64 9 using namespace std; 10 struct matrix 11 { 12 ll m[5][5]; 13 } ans,exm; 14 ll x,m,k,c; 15 struct matrix matrix_mulit(struct matrix aa,struct matrix bb) 16 { 17 struct matrix there; 18 for(int i=0;i<2;i++) 19 { 20 for(int j=0;j<2;j++) 21 { 22 there.m[i][j]=0; 23 for(int u=0;u<2;u++) 24 there.m[i][j]=(there.m[i][j]+aa.m[i][u]*bb.m[u][j]%k)%k; 25 } 26 } 27 return there; 28 } 29 ll matrix_quick(ll xx,ll gg) 30 { 31 exm.m[0][0]=10; 32 exm.m[0][1]=0; 33 exm.m[1][0]=1; 34 exm.m[1][1]=1; 35 ans.m[0][0]=xx; 36 ans.m[1][1]=0; 37 ans.m[0][1]=xx; 38 ans.m[1][0]=0; 39 while(gg) 40 { 41 if(gg&1) 42 ans=matrix_mulit(ans,exm); 43 exm = matrix_mulit(exm, exm); 44 gg >>= 1; 45 } 46 return ans.m[0][0]; 47 } 48 ll n; 49 int main() 50 { 51 while(scanf("%I64d",&n)!=EOF) 52 { 53 for(ll i=1;i<=n;i++) 54 { 55 scanf("%I64d %I64d %I64d %I64d",&x,&m,&k,&c); 56 printf("Case #%d:\n",i); 57 ll ggg=matrix_quick(x,m-1); 58 if(ggg==c) 59 printf("Yes\n"); 60 else 61 printf("No\n"); 62 } 63 } 64 return 0; 65 }
以上是关于HDU 5690 矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章
2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂