BestCoder #58 div1
2015-10-08 19:52
417 查看
2015-10-08 19:14:54
总结:赛后补的一场。题目蛮有意思的。
A:DFS
思路:搜一下几个环然后判断一下即可。
View Code
总结:赛后补的一场。题目蛮有意思的。
A:DFS
思路:搜一下几个环然后判断一下即可。
#include <cstdio> #include <ctime> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; #define getmid(l,r) ((l) + ((r) - (l)) / 2) #define MEM(a,b) memset(a,b,sizeof(a)) #define MP(a,b) make_pair(a,b) #define PB push_back typedef long long ll; typedef pair<int,int> pii; const double eps = 1e-8; const int INF = (1 << 30) - 1; const int MAXN = 110; int T,n,m,p,q,mod; int D[MAXN][MAXN],G[MAXN][MAXN]; ll Det(int n){ ll A[MAXN][MAXN]; for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) A[i][j] = D[i][j]; ll res = 1; for(int i = 1; i <= n; ++i){ for(int j = i + 1; j <= n; ++j){ while(A[j][i]){ ll t = A[i][i] / A[j][i]; for(int k = i; k <= n; ++k) A[i][k] = (A[i][k] - A[j][k] * t) % mod; for(int k = i; k <= n; ++k) swap(A[i][k],A[j][k]); res = -res; } } if(!A[i][i]) return 0; res = res * A[i][i] % mod; } return (res + mod) % mod; } struct Mx{ ll a[MAXN][MAXN]; void clear(){ MEM(a,0); } void stand(){ clear(); for(int i = 1; i <= n; ++i) a[i][i] = 1; } Mx operator * (const Mx &b){ Mx c; c.clear(); for(int k = 1; k <= n; ++k) for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j){ c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j]) % mod; } return c; } }; Mx t; Mx Q_pow(int v){ Mx res; res.stand(); while(v){ if(v & 1) res = res * t; t = t * t; v >>= 1; } return res; } int main(){ scanf("%d",&T); while(T--){ MEM(D,0); MEM(G,0); scanf("%d%d%d%d",&n,&m,&p,&q); mod = p; for(int i = 1; i <= m; ++i){ int a,b; scanf("%d%d",&a,&b); D[a][a]++; D[b][b]++; G[a][b] = G[b][a] = 1; } for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) D[i][j] -= G[i][j]; ll val = Det(n - 1); //structure Mx t t.clear(); for(int i = 1; i <= n; ++i){ t.a[i][i] = i; t.a[i][i - 1] = n - i; } Mx ans; ans.clear(); ans.a[1][1] = n - 1; ans = Q_pow(q - 1) * ans; printf("%lld\n",(val * ans.a[n - 1][1]) % mod); } return 0; }
View Code
相关文章推荐
- UVA437
- LeetCode OJ:Valid Palindrome(验证回文)
- 关于一些对location认识的误区
- CYC-爱心暖暖的小动画
- UESTC 1712 Easy Problem With Numbers 除法对和数取模,分解,线段树
- Java 安全套接字编程以及 keytool 使用最佳实践
- 第6周项目2--建立链栈算法库
- NSUserDefaults
- 【前端学习】javascript作用域(链)和this
- UIScorollView运用与属性详解
- 最小生成树之prim算法
- 仓储管理流程图
- 导入https证书
- 地图的基础使用
- 使用 TestLink 进行测试管理
- 【mongoDB高级篇③】综合实战(1): 分析国家地震数据
- 最大子序列和
- hdu2795 Billboard 线段树
- superoj441 餐巾计划
- iOS开发 大文件下载封装