#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read(){int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 550+5;
int n,m,s,t;
ll o;
bool A[maxn][maxn],B[maxn][maxn];
bitset<maxn>ar[maxn],br[maxn];
void Matix_pow(bool a[maxn][maxn],bool b[maxn][maxn],bool c[maxn][maxn])
{
for(int i=0;i<n;i++){
ar[i].reset();
for(int j=0;j<n;j++) ar[i][j]=a[i][j];
}
for(int j=0;j<n;j++){
br[j].reset();
for(int i=0;i<n;i++) br[j][i]=b[i][j];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=(ar[i]&br[j]).any();
}
void Matix(bool a[maxn][maxn],bool b[maxn][maxn])
{
bool f[maxn][maxn];
memcpy(f,a,sizeof(f));
while (o){
if(o&1) Matix_pow(b,f,b);
Matix_pow(f,f,f);
o>>=1;
}
}
int main()
{
n=read(),s=read(),t=read();
scanf("%lld",&o);
m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
A[u-1][v-1]=true;
}
for(int i=0;i<n;i++) B[i][i]=true;
Matix(A,B);
if(B[s-1][t-1]) printf("They call me Prophet\n");
else printf("Remember me\n");
return 0;
}
2912: 先知归来(矩阵快速幂+bitset优化)
最新推荐文章于 2021-06-16 16:51:06 发布