G2.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int juzhen[2][2],final[2][2];
  4. void jzcf1()
  5. {
  6. int res[2][2];
  7. res[0][0]=(juzhen[0][0]*final[0][0]+juzhen[0][1]*final[1][0])%7;
  8. res[0][1]=(juzhen[0][0]*final[0][1]+juzhen[0][1]*final[1][1])%7;
  9. res[1][0]=(juzhen[1][0]*final[0][0]+juzhen[1][1]*final[1][0])%7;
  10. res[1][1]=(juzhen[1][0]*final[0][1]+juzhen[1][1]*final[1][1])%7;
  11. for(int i=0;i<=1;i++)
  12. for(int j=0;j<=1;j++)
  13. juzhen[i][j]=res[i][j];
  14. }
  15. void jzcf2()
  16. {
  17. int res[2][2];
  18. res[0][0]=(final[0][0]*final[0][0]+final[0][1]*final[1][0])%7;
  19. res[0][1]=(final[0][0]*final[0][1]+final[0][1]*final[1][1])%7;
  20. res[1][0]=(final[1][0]*final[0][0]+final[1][1]*final[1][0])%7;
  21. res[1][1]=(final[1][0]*final[0][1]+final[1][1]*final[1][1])%7;
  22. for(int i=0;i<=1;i++)
  23. for(int j=0;j<=1;j++)
  24. final[i][j]=res[i][j];
  25. }
  26. int main()
  27. {
  28. int flag=1;
  29. while(flag)
  30. {
  31. int a,b;
  32. int ans;
  33. long long int n;
  34. scanf("%d%d%lld",&a,&b,&n);
  35. if(a || b || n)
  36. {
  37. final[0][0]=a;
  38. final[0][1]=b;
  39. final[1][0]=1;
  40. final[1][1]=0;
  41. juzhen[0][0]=1;
  42. juzhen[0][1]=0;
  43. juzhen[1][0]=0;
  44. juzhen[1][1]=1;
  45. if(n>=3)
  46. {
  47. n-=2;
  48. while(n) ///矩阵快速幂
  49. {
  50. if(n&1)
  51. {
  52. jzcf1();
  53. }
  54. jzcf2();
  55. n >>= 1;
  56. }
  57. ans=(juzhen[0][0]+juzhen[0][1])%7;///此处应为final[0][0]*f(2)+final[0][1]*f(1)
  58. cout << ans << endl;
  59. }
  60. else
  61. cout << "1" << endl; ///n=1,2时不妨直接输出1
  62. }
  63. else
  64. flag=0;
  65. }
  66. return 0;
  67. }