#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main(){ //freopen("in.txt","r",stdin); int T;scanf("%d",&T); while(T--){ int x,y; scanf("%d%d",&x,&y); cout<<abs(2*x*y)<<endl; } return 0; }
思路:可知距离每个点最近的点必然是它本身,距离唯一。所以只需要把所有相互之间距离为0的点通过并查集缩团就好。一开始想写dfs超时了,然后换了并查集,因为脑残原因WA了几发。
#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int par[100100]; int cnt[100100]; int find(int x){ return par[x]=(x==par[x]?x:find(par[x])); } int main(){ //freopen("in.txt","r",stdin); int T;scanf("%d",&T); while(T--){ int n;scanf("%d",&n); for(int i=0;i<=n;i++){ par[i]=i; cnt[i]=1; } for(int i=0;i<n-1;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); if(!w){ par[v]=find(u); cnt[par[v]]+=cnt[v]; } } for(int i=1;i<=n;i++) cnt[i]=cnt[par[find(i)]]; int ans=cnt[1]; for(int i=2;i<=n;i++) ans^=cnt[i]; printf("%d\n",ans); } return 0; }
思路:之前做个一个类似的,随机选择图上一点出发,等概率去往与他相邻的点,求k步之后他在每个点的概率。这个题的概率转移方程跟之前那题一直,只是因为点小于20个,所以变成矩阵的形式,然后再通过矩阵快速幂计算就好了。值得一提的是快速幂的模板有问题,导致WA。还有不知道数论的一个定理。谢谢bc群里的菊苣们。
#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const ll MOD=1e9+7; const int MAXN=60; //矩阵阶数 bool G[60][60]; int tot[60]; struct Matrix{ ll m[MAXN][MAXN]; Matrix() { memset(m,0,sizeof(m)); for(int i=0;i<MAXN;i++) m[i][i]=1; } void clear(){ memset(m,0,sizeof(m)); } void show(){ for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++) cout<<m[i][j]<<" "; cout<<endl; } } }; Matrix mtMul(Matrix A,Matrix B) { int i,j,k,tmp; Matrix C; C.clear(); for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) for(int k=0;k<MAXN;k++) C.m[i][j]=(C.m[i][j]%MOD+(A.m[i][k]%MOD)*(B.m[k][j]%MOD))%MOD; return C; } Matrix mtPow(Matrix A,int k) { k--; Matrix ans=A; while(k){ if(k&1) ans=mtMul(ans,A); A=mtMul(A,A); k>>=1; } return ans; } ll Quick_pow(ll x,int m){ ll sum=1; while(m){ if(m&1) sum=((sum%MOD)*(x%MOD))%MOD; x=((x%MOD)*(x%MOD))%MOD; m>>=1; } return sum; } int main(){ //freopen("in.txt","r",stdin); int n,m; while(cin>>n>>m){ int u,v; Matrix M; M.clear(); memset(G,0,sizeof(G)); memset(tot,0,sizeof(tot)); while(m--){ cin>>u>>v; tot[u-1]++; G[v-1][u-1]=true; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(G[i][j]){ M.m[i][j]=((M.m[i][j])%MOD+Quick_pow(tot[j],1e9+5)%MOD)%MOD; } int Q; cin>>Q; while(Q--){ int u,k; cin>>u>>k; Matrix ans=mtPow(M,k); //ans.show(); for(int i=0;i<n;i++) cout<<ans.m[i][u-1]<<" "; cout<<endl; } } return 0; }
时间: 2024-10-08 02:35:37