#include using namespace std; #if __has_include() #include using namespace atcoder; templateistream &operator>>(istream &is,static_modint &a){long long b;is>>b;a=b;return is;} istream &operator>>(istream &is,modint &a){long long b;cin>>b;a=b;return is;} #endif #ifdef LOCAL #include "debug.h" #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) templateostream &operator<<(ostream &os,const pair&p){os<; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define reps(i,a,n) for(int i=(a);i<(n);i++) #define rep(i,n) reps(i,0,n) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcount(x) ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } void SOLVE(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef LOCAL clock_t start=clock(); #endif int testcase=1; //cin>>testcase; for(int i=0;iMaximumIndependentSet(const vector>&edge){ int n=edge.size(); vectorv(n); iota(all(v),0); vectorcnt(n,0); rep(i,n)rep(j,n)cnt[i]+=edge[i][j]; vectorret,now(n); int b=0; auto dfs=[&](auto self,vector::iterator itr,int s){ if(ret.size()>=n+s)return; if(s==0){ if(ret.size()(now.begin(),now.begin()+b); return; } int nv=0; rep(i,s)if(cnt[itr[i]]<=1){ swap(itr[0],itr[i]); nv=1; break; } if(nv==0){ rep(i,s)if(cnt[itr[0]]=3)nv=2; } if(nv!=0){ int p=itr[0],c=1; reps(i,1,s){ if(edge[p][itr[i]]){ swap(itr[c],itr[i]); reps(j,c+1,s){ cnt[itr[j]]-=edge[itr[c]][itr[j]]; } ++c; } } now[b++]=p; self(self,itr+c,s-c); for(int j=c-1;j>=1;j--)for(int i=j+1;iseen(s,false); rep(i,s)if(!seen[i]){ for(int u=i,ni=0;!seen[u];ni=1-ni){ int nxt=-1; rep(j,s)if(!seen[j]&&edge[itr[u]][itr[j]]){ nxt=j; break; } if(nxt==-1)break; if(ni)now[b++]=itr[u],r++; seen[u]=true; u=nxt; } } if(ret.size()(now.begin(),now.begin()+b); b-=r; }; dfs(dfs,v.begin(),n); return ret; } void SOLVE(){ ll s; cin>>s; s=(s*12345)%1000003; int n=(s%120)+2; s=(s*12345)%1000003; int p=s; vector>f(n,vector(n,0)); rep(i,n)reps(j,i+1,n){ s=(s*12345)%1000003; f[i][j]=f[j][i]=s; } vector>edge(n,vector(n,false)); rep(i,n)rep(j,n)edge[i][j]=f[i][j]>=p; auto ans=MaximumIndependentSet(edge); if(ans.size()==n){ cout<<-1<