Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33945 22fhq 【S】T2 C++ 解答错误 40 1000 MS 672 KB 1563 2024-10-30 16:05:29

Tests(4/10):


#include<bits/stdc++.h> using namespace std; int n,k; vector<pair<int,int>>an,ans; bool g=0; int fa[100005],sz[100005]; stack<int>st; int getf(int p){ return fa[p]==p?p:getf(fa[p]); } void mg(int x,int y){ x=getf(x),y=getf(y); if(sz[x]>sz[y])fa[y]=x,sz[x]+=sz[y],st.push(y); else fa[x]=y,sz[y]+=sz[x],st.push(x); } void del(){ int lst=st.top(); st.pop(); sz[fa[lst]]-=sz[lst]; fa[lst]=lst; } bool chk(){ for(int i=1;i<n;i++){ if(getf(0)!=getf(i))return 0; } return 1; } void dfs(int p){ if(p>n/2){ if(chk()){ ans=an; g=1; } return; } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(getf(i)==getf(j))continue; mg(i,j); if(getf((i+k)%n)==getf((j+k)%n)){ del(); continue; } mg((i+k)%n,(j+k)%n); an.push_back({i,j}); dfs(p+1); del(),del(); if(g)return; } } } int gcd(int x,int y){ return y?gcd(y,x%y):x; } int main(){ cin>>n>>k; if(n%2==0){ cout<<-1; return 0; } if(gcd(n,k)==1){ cout<<n/2<<endl; for(int i=1;i<n;i+=2)cout<<k*(i)%n<<" "<<(k+k*(i))%n<<'\n'; return 0; } for(int i=0;i<n;i++)fa[i]=i; dfs(1); if(!g)cout<<-1; else { cout<<ans.size()<<endl; for(auto x:ans)cout<<x.first<<" "<<x.second<<endl; } return 0; }


测评信息: