1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include <bits/stdc++.h> using namespace std;
using ll = long long; const int maxn = 2e5 + 5; const int mod = 998244353;
ll a[ maxn ]; map< ll, vector< int > > radj[ maxn ]; map< ll, int > memo[ maxn ]; int n, m;
int dfs( int u, ll diff ) { if( diff <= 0 ) return 0; if( memo[ u ].count( diff ) ) return memo[ u ][ diff ]; ll cnt = 0; if( radj[ u ].count( diff ) ) { for( int w : radj[ u ][ diff ] ) { cnt = ( cnt + 1 ) % mod; cnt = ( cnt + dfs( w, a[ u ] - diff ) ) % mod; } } return memo[ u ][ diff ] = ( int )cnt; }
void solve( ) { cin >> n >> m; for( int i = 1; i <= n; ++ i ) { radj[i].clear( ); memo[i].clear( ); } for( int i = 1; i <= n; ++ i ) cin >> a[i];
vector< pair< int, int > > edges; for( int i = 0; i < m; ++ i ) { int u, v; cin >> u >> v; edges.push_back( { u, v } ); radj[ v ][ a[ u ] ].push_back( u ); }
ll ans = 0; for( auto &e : edges ) { ans = ( ans + 1 ) % mod; ans = ( ans + dfs( e.first, a[ e.second ] - a[ e.first ] ) ) % mod; } cout << ans << "\n"; }
int main( ) { ios::sync_with_stdio( 0 ); cin.tie( 0 ); int t; cin >> t; while( t -- ) solve( ); return 0; }
|