#include <bits/stdc++.h>
using namespace std;
#define FOR(i, l, r) for(int i = (l); i < (r); ++i)
#define ROF(i, r, l) for(int i = (r)-1; i >= (l); --i)
#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
#define pb push_back
#define eb emplace_back
#define sz(v) (int)v.size()
#define compact(v) v.erase(unique(all(v)), end(v))
#define dbg(x) "[" #x " = " << (x) << "]"
template<typename T>
bool minimize(T& a, const T& b){
if(a > b) return a = b, true;
return false;
}
template<typename T>
bool maximize(T& a, const T& b){
if(a < b) return a = b, true;
return false;
}
using ll = long long;
using db = double;
using ld = long double;
using ull = unsigned long long;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using pd = pair<db, db>;
using vi = vector<int>;
using vl = vector<ll>;
using vb = vector<bool>;
using vc = vector<char>;
using vpi = vector<pi>;
using vpl = vector<pl>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const int MAX = 5e5 + 5;
const int mod = 1e9 + 7;
struct mint{
int v;
mint(int v = 0) : v(v) {}
friend bool operator == (const mint& a, const mint& b){ return a.v == b.v; }
friend bool operator != (const mint& a, const mint& b){ return a.v != b.v; }
mint& operator += (const mint& o){ v += o.v; if(v >= mod) v -= mod; return *this; }
mint& operator -= (const mint& o){ v -= o.v; if(v < 0) v += mod; return *this; }
mint& operator *= (const mint& o){ v = 1LL * v * o.v % mod; return *this; }
friend mint operator + (mint a, const mint& b){ return a += b; }
friend mint operator - (mint a, const mint& b){ return a -= b; }
friend mint operator * (mint a, const mint& b){ return a *= b; }
friend ostream& operator << (ostream& out, const mint& o){ return out << o.v; }
};
int N, M, sign[MAX], positive_require[MAX], negative_require[MAX];
mint dp[2][26], ans;
void construct(){
FOR(i, 0, 26) dp[0][i] = 1;
// FOR(i, 1, N) cout << sign[i] << ' '; cout << '\n';
int cur = 0, pre = 1;
FOR(i, 1, N){
if(sign[i] != 0){
swap(cur, pre);
if(sign[i] == -1){
mint sum = 0;
ROF(j, 26, 0){
dp[cur][j] = sum;
sum += dp[pre][j];
}
} else{
mint sum = 0;
FOR(j, 0, 26){
dp[cur][j] = sum;
sum += dp[pre][j];
}
}
// FOR(j, 0, 26) cout << dp[cur][j] << ' '; cout << '\n';
}
}
// mint tmp = 0;
// FOR(i, 0, 26) tmp += dp[cur][i];
// cout << dbg(tmp) << '\n';
FOR(i, 0, 26) ans += dp[cur][i];
}
void rec(int pos){
if(pos == N){
bool ok = true;
FOR(i, 1, N){
if(positive_require[i]){
FOR(j, i, positive_require[i]+1){
if(sign[j] != 0){
if(sign[j] == -1){
ok = false;
}
break;
}
}
if(!ok) break;
}
if(negative_require[i]){
FOR(j, i, negative_require[i]+1){
if(sign[j] != 0){
if(sign[j] == +1){
ok = false;
}
break;
}
}
if(!ok) break;
}
}
if(ok) construct();
} else{
sign[pos] = -1;
rec(pos+1);
sign[pos] = 0;
rec(pos+1);
sign[pos] = +1;
rec(pos+1);
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
#ifdef LOCAL
freopen("task.inp", "r", stdin);
freopen("task.out", "w", stdout);
#endif // LOCAL
cin >> N >> M;
while(M--){
int a, b;
cin >> a >> b;
if(a < b){
maximize(positive_require[a], b-1);
} else{
maximize(negative_require[b], a-1);
}
}
rec(1);
cout << ans.v << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |