Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define sc(a) scanf("%d", &a)
  4. #define sc2(a, b) scanf("%d%d", &a, &b)
  5. #define sc3(a, b, c) scanf("%d%d%d", &a, &b, &c)
  6. #define scs(a) scanf("%s", a)
  7. #define pri(x) printf("%d\n", x)
  8. #define prie(x) printf("%d ", x)
  9. #define mp make_pair
  10. #define pb push_back
  11. #define BUFF ios::sync_with_stdio(false);
  12. #define db(x) cerr << #x << " == " << x << endl
  13. typedef long long int ll;
  14. typedef long double ld;
  15. typedef pair<int, int> ii;
  16. typedef vector<ll> vi;
  17. typedef vector<vector<ll> > vvi;
  18. typedef vector<ii> vii;
  19. typedef vector< vii> vvii;
  20. const int INF = 0x3f3f3f3f;
  21. const ll LINF = 0x3f3f3f3f3f3f3f3fll;
  22. const ld pi = acos(-1);
  23. int MOD = 1;
  24. int n=2;
  25. vvi matmul(vvi &m1, vvi &m2)
  26. {
  27. vvi ans;
  28. ans.resize(m1.size(), vi(m2.size(), 0));
  29. for (int i = 0; i < n; i++)
  30. for (int j = 0; j < n; j++)
  31. for (int k = 0; k < n; k++) {
  32. ans[i][j] += m1[i][k] * m2[k][j];
  33. ans[i][j] %= MOD;
  34. }
  35. return ans;
  36. }
  37. vvi matpow(vvi &m1, ll p)
  38. {
  39. vvi ans;
  40. ans.resize(m1.size(), vi(m1.size(), 0));
  41. for (int i = 0; i < n; i++) ans[i][i] = 1;
  42. while (p) {
  43. if (p & 1) ans = matmul(ans, m1);
  44. m1 = matmul(m1, m1);
  45. p >>= 1;
  46. }
  47. return ans;
  48. }
  49. // VETOR TEM N LINHAS E A MATRIZ E QUADRADA
  50. vi mulvet(vvi &m1, vi &vet)
  51. {
  52. vi ans;
  53. ans.resize(vet.size(), 0);
  54. for (int i = 0; i < n; i++)
  55. for (int j = 0; j < n; j++) {
  56. ans[i] += (m1[i][j] * vet[j]);
  57. ans[i] %= MOD;
  58. }
  59. return ans;
  60. }
  61. int main()
  62. {
  63. ll a,b,n,k;
  64. cin>>a>>b>>n>>k;
  65. for(int i=0;i<k;i++) MOD*=10;
  66. vvi m1(2, vi(2, 0));
  67. m1[0][0] = a;
  68. m1[0][1] = b;
  69. m1[1][0] = 1;
  70. m1[1][1] = a;
  71.  
  72. vvi m2(2, vi(2, 0));
  73. m2[0][0] = a;
  74. m2[0][1] = -b;
  75. m2[1][0] = -1;
  76. m2[1][1] = a;
  77. m1= matpow(m1, n-1);
  78. m2= matpow(m2, n-1);
  79. vi v(2, 0);
  80. vi v2(2, 0);
  81. v[0] = v2[0] = a;
  82. v[1] = 1;
  83. v2[1] = -1;
  84.  
  85. vi cu= mulvet(m1, v);
  86. vi cu2= mulvet(m2, v2);
  87.  
  88. ll resp= cu[0] + cu2[0];
  89.  
  90. resp%=MOD;
  91. resp+=MOD;
  92. resp%=MOD;
  93. if(n%2==0 or a*a>=b){
  94. if(a*a == b) resp++;
  95. resp--;
  96. }
  97. resp= (resp+MOD)%MOD;
  98. resp%=MOD;
  99. MOD/=10;
  100. cout<<resp/MOD<<endl;
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement