fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 1e5 + 5;
  12. const int MOD = 1e9 + 7;
  13.  
  14. void add(int& a, int b) {
  15. a += b;
  16. if (a >= MOD) a -= MOD;
  17. }
  18.  
  19. int n, m;
  20. vector<int> adj[N];
  21.  
  22. // Đối với cách cài 2 in 1 này thì thực chất ta đang đi tính các giá trị dp với thứ tự topo ngược
  23. // dp(u) là số cách đi từ u đến n
  24. int memo[N];
  25.  
  26. int dp(int u) {
  27. if (u == n) return 1;
  28. int& ans = memo[u];
  29. if (ans != -1) return ans;
  30. ans = 0;
  31. for (int v : adj[u]) {
  32. add(ans, dp(v));
  33. }
  34. return ans;
  35. }
  36.  
  37. int main() {
  38. ios::sync_with_stdio(false);
  39. cin.tie(nullptr);
  40. cin >> n >> m;
  41.  
  42. for (int i = 0; i < m; i++) {
  43. int u, v;
  44. cin >> u >> v;
  45. adj[u].push_back(v);
  46. }
  47.  
  48. memset(memo, -1, sizeof memo);
  49.  
  50. cout << dp(1) << '\n';
  51. }
Success #stdin #stdout 0.01s 6292KB
stdin
4 5
1 2
2 4
1 3
3 4
1 4
stdout
3