■1221 Numoeba
制限時間・メモリ共に余裕があるので,あとは気合で書くだけ.import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class Main{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int k;
int m;
int mod=12345678;
boolean[] visited=new boolean[10000];
void run(){
for(;;){
k=sc.nextInt();
if(k==0){
break;
}
solve();
}
}
void solve(){
Cell leader=new Cell(k);
m=0;
int maxNum=1;
for(int k=1;; k++){
LinkedList<Cell> que=new LinkedList<Cell>();
que.offer(leader);
fill(visited, false);
visited[leader.v]=true;
for(; !que.isEmpty();){
Cell c=que.poll();
int n=c.n*3+1;
for(; n%2==0;){
n/=2;
}
n%=mod;
c.candidate=n>c.n&&(c.size()==0||(c.size()==1&&c!=leader));
c.n=n;
if(c.n==1){
if(c==leader){
println(k+" "+maxNum);
return;
}
Cell par=null;
for(Cell d : c){
if(visited[d.v]){
par=d;
}
d.remove(c);
}
c.remove(par);
if(c.size()==1){
Cell child=c.getFirst();
par.add(child);
child.add(par);
que.offer(child);
visited[child.v]=true;
}
}else{
for(Cell d : c){
if(!visited[d.v]){
que.offer(d);
visited[d.v]=true;
}
}
}
}
fill(visited, false);
Cell newLeader=new Cell(0);
boolean overlap=false;
int num=0;
que.offer(leader);
visited[leader.v]=true;
for(; !que.isEmpty();){
Cell c=que.poll();
num++;
for(Cell d : c){
if(!visited[d.v]){
que.offer(d);
visited[d.v]=true;
}
}
if(c.n>newLeader.n){
newLeader=c;
overlap=false;
}else if(c.n==newLeader.n){
overlap=true;
}
if(c.candidate&&((c.size()==1&&c!=leader)||c.size()==0)){
Cell d=new Cell(((c.n+1)/2)|1);
if(d.n!=1){
c.add(d);
d.add(c);
num++;
}
}
}
if(!overlap){
leader=newLeader;
Cell c=new Cell(((leader.n+1)/2-1)|1);
if(c.n!=1){
leader.add(c);
c.add(leader);
num++;
}
}
maxNum=max(maxNum, num);
}
}
void dfs(Cell leader){
fill(visited, false);
dfs(leader, "");
}
void dfs(Cell c, String tab){
debug(tab, c.n, c.size(), c.v);
visited[c.v]=true;
for(Cell d : c){
if(!visited[d.v]){
dfs(d, tab+" ");
}
}
}
class Cell extends LinkedList<Cell>{
int n, v;
boolean candidate;
Cell(int n){
this.n=n;
this.v=m++;
}
@Override
public int hashCode(){
return v;
}
@Override
public boolean equals(Object o){
return hashCode()==((Cell)o).hashCode();
}
}
void debug(Object... os){
System.err.println(Arrays.deepToString(os));
}
void print(String s){
System.out.print(s);
}
void println(String s){
System.out.println(s);
}
public static void main(String[] args){
// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
new Main().run();
}
}
0 件のコメント:
コメントを投稿