Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Author : DemonStar
- */
- // #pragma GCC optimize("Ofast")
- // #pragma GCC optimize("unroll-loops")
- // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx2,tune=native")
- #include <bits/stdc++.h>
- using namespace std;
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag, tree_order_statistics_node_update>
- #define fast \
- ios_base::sync_with_stdio(0); \
- cin.tie(0); \
- cout.tie(0);
- #define ll long long
- #define pi pair<int, int>
- #define pl pair<long long, long long>
- #define pld pair<long double, long double>
- #define endl '\n'
- #define loop(i, n) for (ll i = 0; i < n; i++)
- #define rep(i, begin, end) for (__typeof(begin) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
- #define mod ((ll)(1e9 + 7))
- #define all(x) x.begin(), x.end()
- #define vl vector<ll>
- #define vi vector<int>
- #define ml map<ll, ll>
- #define vpl vector<pair<ll, ll>>
- template <typename T, typename TT>
- ostream &operator<<(ostream &os, const pair<T, TT> &t)
- {
- return os << t.first << " " << t.second;
- }
- template <typename T>
- ostream &operator<<(ostream &os, const vector<T> &t)
- {
- for (auto &i : t)
- os << i << " ";
- return os;
- }
- template <typename T>
- istream &operator>>(istream &is, vector<T> &v)
- {
- for (T &t : v)
- is >> t;
- return is;
- }
- template <typename T1, typename T2>
- istream &operator>>(istream &is, vector<pair<T1, T2>> &v)
- {
- for (pair<T1, T2> &t : v)
- is >> t.first >> t.second;
- return is;
- }
- vector<vl> mul(vector<vl> a, vector<vl> b)
- {
- ll n = a.size();
- vector<vl> c(n, vl(n, 0));
- loop(i, n)
- loop(j, n)
- loop(k, n)(c[i][j] += a[i][k] * b[k][j]) %= mod;
- return c;
- }
- vector<vl> modpow(vector<vl> m, ll p)
- {
- vector<vl> ans = m;
- p--;
- while (p)
- {
- if (p & 1)
- ans = mul(m, ans);
- m = mul(m, m), p /= 2;
- }
- return ans;
- }
- int main()
- {
- fast;
- int n, m, k;
- cin >> n >> m >> k;
- vector<vl> v(n, vl(n, 0));
- while (m--)
- {
- int a, b;
- cin >> a >> b;
- v[a - 1][b - 1] = 1;
- }
- cout << modpow(v, k)[0][n - 1] << endl;
- #ifdef LOCAL
- cerr
- << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
- #endif
- return 0;
- }
Add Comment
Please, Sign In to add comment