Advertisement
Guest User

16

a guest
Dec 5th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void multiply(int k, unsigned long long **a, unsigned long long **b, unsigned long long p) {
  5. unsigned long long **C = malloc(k * sizeof(unsigned long long *));
  6. for (int i = 0; i < k; i++)
  7. C[i] = calloc(k, sizeof(unsigned long long));
  8. for (int i = 0; i < k; i++)
  9. for (int j = 0; j < k; j++)
  10. for (int s = 0; s < k; s++) {
  11. C[i][j] += a[i][s] * b[s][j];
  12. C[i][j] %= p;
  13. }
  14. for (int i = 0; i < k; i++)
  15. for (int j = 0; j < k; j++)
  16. a[i][j] = C[i][j];
  17. free(C);
  18. }
  19.  
  20. void binpow(unsigned long long **a, unsigned long long **res, unsigned long long n, int k, unsigned long long p) {
  21. while (n) {
  22. if (n & 1)
  23. multiply(k, res, a, p);
  24. multiply(k, a, a, p);
  25. n >>= 1;
  26. }
  27. }
  28.  
  29. int main(void) {
  30. int k;
  31. unsigned long long n, p;
  32. scanf("%d %llu %llu", &k, &n, &p);
  33. unsigned long long **A = malloc(k * sizeof(unsigned long long *));
  34. for (int i = 0; i < k; i++)
  35. A[i] = calloc(k, sizeof(unsigned long long));
  36. unsigned long long **B = malloc(k * sizeof(unsigned long long *));
  37. for (int i = 0; i < k; i++) {
  38. B[i] = calloc(k, sizeof(unsigned long long));
  39. B[i][i] = 1;
  40. }
  41. unsigned long long F[k];
  42. unsigned long long Fn = 0;
  43. unsigned long long pow = n - k;
  44.  
  45. for (int i = k - 1; i >= 0; i--)
  46. scanf("%llu", &F[i]);
  47.  
  48. if (n <= k) {
  49. printf("%llu", F[k - n] % p);
  50. return 0;
  51. }
  52.  
  53. for (int i = 0; i < k; i++)
  54. scanf("%llu", &A[0][i]);
  55. for (int i = 0; i < k - 1; i++)
  56. A[i + 1][i] = 1;
  57.  
  58. binpow(A, B, pow, k, p);
  59.  
  60. for (int i = 0; i < k; i++) {
  61. Fn += B[0][i] * F[i];
  62. Fn %= p;
  63. }
  64.  
  65. printf("%llu", Fn);
  66.  
  67. free(A);
  68. free(B);
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement