EF Java题解,代码已去除冗余~~~
容易知道,数组的长度一定为a+2,且b和c不大于a,,那么不妨初始化答案数组为全2,此时全部长度为3子数组都能整除2或者3,其次子数组位置在b和c之间数字从前到后通过自加,调整到和能整除3且不整除2(或者相反),再把b和c位置后边的数字调整成为既不整除2也不整除3,每个位置最多自加5次,时间复杂度O(5a)
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt(),ans[]=new int[a+2];
if(Math.max(b,c)>a){
System.out.println(-1);
}
else{
Arrays.fill(ans,2);
for(int i=b+2;i<c+2;i++){
while((ans[i]+ans[i-2]+ans[i-1])%2==0||(ans[i]+ans[i-2]+ans[i-1])%3!=0){
ans[i]++;
}
}
for(int i=c+2;i<b+2;i++){
while((ans[i]+ans[i-2]+ans[i-1])%3==0||(ans[i]+ans[i-2]+ans[i-1])%2!=0){
ans[i]++;
}
}
for(int i=Math.max(b,c)+2;i<a+2;i++){
while((ans[i]+ans[i-2]+ans[i-1])%3==0||(ans[i]+ans[i-2]+ans[i-1])%2==0){
ans[i]++;
}
}
System.out.println(a+2);
for(int p:ans){
System.out.print(p+" ");
}
}
}
}
当n小于4的时候,用尝试法求答案;而在n大于等于4的时候,可以构造长度为n的:“1000...001”以及“213131313....3121”,时间复杂度O(n)
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
if(n<4){
System.out.println(n==1?"-1":n==2?"11 12":"143 861");
}
else{
System.out.print(1);
for(int i=0;i<n-2;i++){
System.out.print(0);
}
System.out.print("1 21");
for(int i=0;i<n-4;i++){
System.out.print(i%2==0?3:1);
}
System.out.println(21);
}
}
}