PKU 3652-Persistent Bits

問題概要

X0=S

Xn=(A×Xn-1+B)%C
で表わされる数列Xの各Bitについて,0しか取らない,1しか取れない,0と1のどちらも取り得るの3種類のうちどれに当て嵌まるか答えよ.

解法

全部試してみる

実装(Java)

import java.util.*;
import java.math.*;
import java.io.*;
import java.util.regex.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
import static java.lang.System.*;

public class Main {
	Scanner cin;
	String[]res={"!","0","1","?"};
	void run(){
		cin=new Scanner(System.in);
		int A,B,C,S;
		while(true){
			A=cin.nextInt();
			if(A==0)break;
			B=cin.nextInt();
			C=cin.nextInt();
			S=cin.nextInt();
			int[] ans=new int[16];
			Set<Integer> visited=new HashSet<Integer>();
			while(visited.contains(S)==false){
				for(int i=0;i<16;i++){
					if(((S>>i)&1)==0){
						ans[i]|=1;
					}else{
						ans[i]|=2;
					}
				}
				visited.add(S);
				S=(int) ((A*(long)S+B)%C);
			}
			for(int i=15;i>=0;i--){
				printf("%s",res[ans[i]]);
			}
			printf("\n");
		}
	}

	void printf(String format,Object... args){
		System.out.printf(format, args);
	}

	public static void main(String[] args) {
		new Main().run();
	}

}