CF2176D Fibonacci Paths 题解
Mier_Samuelle · · 题解
考虑 dp。
定义边
考虑做一个朴素的 dp。定义
考虑优化。为了快速计算
如何理解这个方程?我们发现,
答案即为
时间复杂度
:::success[代码]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 10;
const int MOD = 998244353;
ll a[MAXN];
struct Edge{
int u, v;
}e[MAXN];
bool cmp(Edge x, Edge y){
return a[x.u] + a[x.v] < a[y.u] + a[y.v];
}
map <ll, int> dp[MAXN];
void solve(){
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++){
cin >> a[i];
}
for (int i = 1; i <= m; i++){
cin >> e[i].u >> e[i].v;
}
sort(e + 1, e + m + 1, cmp);
for (int i = 1; i <= n; i++){
dp[i].clear();
}
int ans = 0;
for (int i = 1; i <= m; i++){
int u = e[i].u, v = e[i].v;
ans = (ans + dp[u][a[v]] + 1) % MOD;
dp[v][a[u] + a[v]] = (dp[v][a[u] + a[v]] + dp[u][a[v]] + 1) % MOD;
}
cout << ans << endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--){
solve();
}
return 0;
}
:::