diff --git a/contests/Cadernaveis/URI1033.cpp b/contests/Cadernaveis/URI1033.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f85f5ef31ad7d9bac84c95bdeb0d14548c4b211f --- /dev/null +++ b/contests/Cadernaveis/URI1033.cpp @@ -0,0 +1,98 @@ +#include <bits/stdc++.h> + +#define EPS 1e-6 +#define MOD 1000000007 +#define inf 0x3f3f3f3f +#define llinf 0x3f3f3f3f3f3f3f3f + +#define fi first +#define se second +#define pb push_back +#define ende '\n' + +#define all(x) (x).begin(), (x).end() +#define rall(x) (x).rbegin(), (x).rend() +#define mset(x, y) memset(&x, (y), sizeof(x)) + +using namespace std; + +typedef unsigned long long ll; +typedef pair<int,int> ii; + +struct matrix { + int N; + ll b; + vector<vector<ll>> m; + + matrix(int N, ll b) : N(N), b(b) { + m = vector<vector<ll>>(N, vector<ll>(N, 0)); + } + + matrix operator*(matrix a) { + matrix res(N, b); + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) { + res[i][j] = 0; + + for (int k = 0; k < N; k++) + res[i][j] = (((m[i][k] * a[k][j]) % b) + res[i][j]) % b; + } + + return res; + } + + void to_identity() { + for (auto &i : m) + fill(all(i), 0); + for (int i = 0; i < N; ++i) + m[i][i] = 1; + } + + vector<ll> &operator[](int i) { + return m[i]; + } +}; + +ll fast_pow(matrix in, ll n, ll b) { + matrix ans(2, b); + ans.to_identity(); + + while (n) { + if (n & 1) + ans = ans * in; + + n >>= 1; + in = in * in; + } + + return ans[0][0]; +} + +ll solve(ll n, ll b) { + matrix in(2, b); + + in[0][0] = 1; + in[0][1] = 1; + + in[1][0] = 1; + in[1][1] = 0; + + return fast_pow(in, n, b); +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + + ll n, b; + int cas = 1; + while (cin >> n >> b && (n || b)) { + ll ans = solve(n, b) % b; + ans = (ans + ans) % b; + ans = (ans - 1 + b) % b; + + cout << "Case " << cas++ << ":" << " " << n << " " << b << " " << ans << ende; + } + + return 0; +}