1. 题目就是找到一个数的可以用01序列表示的最小倍数。
2. 自己用java写,无法ac,超时。到网上查,发现大家说的也是此题可以水过去,就是数字是不需要大数的。按照正常的bfs即可。下面第一段代码就是bfs,但是没有ac.但是大家用的都是c++。自己用java无法。
3. 后来参考了高手的,才觉得写得真好。首先用同余模定理简化,当然,其实按理论最后的结果还是很大。但是按照测试,此题不用大数也可以过。然后是根据一个小窍门得到最终结果。就是求模的过程倒过来除以2就是要的数了。
首先是自己写的没有ac的:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Multiple {
static int n;
static LinkedList<Long> queue =new LinkedList<Long>();
static ArrayList<Long> list = new ArrayList<Long>();
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 1; i<=200; i++)
{
n = i;
bfs();
}
//File file = new File("C://Users/23192/Desktop/multiple.txt");
try {
//Scanner scan = new Scanner(file);
Scanner scan = new Scanner(System.in);
while(scan.hasNext())
{
queue.clear();
n = scan.nextInt();
if(n==0)
return;
System.out.println(list.get(n-1));
//bfs();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void bfs()
{
queue.add((long) 1);
while(!queue.isEmpty())
{
Long x = queue.poll();
//System.out.println("x:"+x);
if(x%n==0)
{
//System.out.println(x);
list.add(x);
return;
}
queue.add(x*10+0);
queue.add(x*10+1);
}
}
}
然后是采用小窍门后的代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner scan = new Scanner(System.in);
while(scan.hasNext())
{
//int []mod = new int[524286];
int []mod = new int[500000];
int n = scan.nextInt();
if(n==0)
return;
mod[1]=1%n;
int i;
for(i=2;mod[i-1]!=0;i++)
mod[i]=(mod[i/2]*10+i%2)%n;
i--;
int pm=0;
while(i!=0)
{
mod[pm++]=i%2;
i/=2;
}
while(pm!=0)
System.out.print(mod[--pm]);
System.out.println();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}