51Nod-1610-路径计数
来源:互联网 发布:ubuntu 退出vim 编辑:程序博客网 时间:2024/06/07 12:00
ACM模版
描述
题解
这个题我不会写,看了题解也不怎么会,先
我的数学比较差,容斥玩得不是特别好,玩不转,这个
代码
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <cmath>#define clr(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int MOD = 1e9 + 7;const int MAXN = 101;const int MAXM = 5e4 + 10;int n, m;int a[MAXM];int b[MAXM];int c[MAXM];int dp[MAXN][MAXN][MAXN];ll tmp[MAXN];ll res[MAXN];ll ans[MAXN];ll dfs(int u, int d){ if (res[u] != -1) { return res[u]; } ll ans = 0; for (int i = 1; i <= n; i++) { if (dp[d][u][i]) { ans = (ans + dp[d][u][i] + dp[d][u][i] * dfs(i, d)) % MOD; } } return res[u] = ans;}ll cal(int u){ clr(res, -1); for (int i = 1; i <= n; i++) { if (res[i] == -1) { dfs(i, u); } } ll ans = 0; for (int i = 1; i <= n; i++) { ans = (ans + res[i]) % MOD; } return ans;}int main(){ clr(dp, 0); cin >> n >> m; for (int i = 1; i <= m; i++) { scanf("%d%d%d", &a[i], &b[i], &c[i]); for (int j = 1; j * j <= c[i]; j++) { if (c[i] % j == 0) { dp[j][a[i]][b[i]]++; if (c[i] / j != j) { dp[c[i] / j][a[i]][b[i]]++; } } } } for (int i = 1; i < MAXN; i++) { tmp[i] = cal(i); } for (int i = MAXN - 1; i > 0; i--) { ans[i] = tmp[i]; for (int j = 2 * i; j < MAXN; j += i) { ans[i] -= ans[j]; } ans[i] = (ans[i] % MOD + MOD) % MOD; } cout << ans[1] << endl; int T; cin >> T; while (T--) { int x, y; scanf("%d%d", &x, &y); vector<int> v; for (int i = 1; i * i <= c[x]; i++) { if (c[x] % i == 0) { dp[i][a[x]][b[x]]--; v.push_back(i); if (c[x] / i != i) { dp[c[x] / i][a[x]][b[x]]--; v.push_back(c[x] / i); } } } c[x] = y; for (int i = 1; i * i <= c[x]; i++) { if (c[x] % i == 0) { dp[i][a[x]][b[x]]++; v.push_back(i); if (c[x] / i != i) { dp[c[x] / i][a[x]][b[x]]++; v.push_back(c[x] / i); } } } for (int i = 0; i < v.size(); i++) { tmp[v[i]] = cal(v[i]); } for (int i = MAXN - 1; i > 0; i--) { ans[i] = tmp[i]; for (int j = 2 * i; j < MAXN; j += i) { ans[i] -= ans[j]; } ans[i] = (ans[i] % MOD + MOD) % MOD; } cout << ans[1] << endl; } return 0;}
阅读全文
0 0
- 【51Nod 1610】路径计数
- 51nod 1610 路径计数
- 51Nod-1610-路径计数
- 51nod 1610 路径计数
- 51nod 1610 路径计数(容斥+dp)
- 集合计数 51Nod
- 51nod 1352:集合计数
- 51nod-1682 中位数计数
- 51nod 1352 集合计数
- 51nod 1682 中位数计数
- 51Nod 1352 集合计数
- [51nod 1222]最小公倍数计数
- [51nod 1222]最小公倍数计数
- 51NOD 1682 中位数计数
- 【51NOD 1222】最小公倍数计数
- 51nod-1682 中位数计数
- 51 nod 1222 最小公倍数计数
- 51nod 1222 最小公倍数计数
- Latex 表格 table 宽度太长
- 1048. Find Coins (25)
- JavaSE
- Python数据分析与展示(5)——Pandas库入门
- Unity3d:使用C#脚本生成与解析XML
- 51Nod-1610-路径计数
- 求助,帮忙设计基于stm32的地图导航
- linux驱动链表的使用
- 手残,双硬盘(SSD+HDD)双系统(Win10+ubuntu)用easyBCD删除win10引导项怎么办?戳这里
- jquery 中stop()方法总结
- 使用Jquery Easy UI要导入的js顺序
- C++的那些事
- 随想录(内核模块的测试方法)
- LibreOJ β Round #3