您的位置:首页 > 其它

BestCoder #58 div1

2015-10-08 19:52 417 查看
2015-10-08 19:14:54

总结:赛后补的一场。题目蛮有意思的。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: