给定N个元素,使得从1到N-1的每个元素只出现一次,除了一个。你的任务非常简单。以任何顺序排列这些元素,使得每对相邻元素是互质的。假设我们有5个元素A1,A2,A3,A4,A5,并且所需的顺序是任意顺序B1,B2,B3,B4,B5这样。
gcd(B1,B2) = gcd(B2,B3) = gcd(B3,B4) = gcd(B4,B5) =1.
INPUT:
第一行输入包含一个表示元素数量的整数N.输入的下一行包含N个空格分隔的整数,表示N个元素。
输出:
输出由N个空格分隔的整数组成,表示根据上述条件的有效序列。
约束:
N<=5*10^6
A[i] <= [common sense]
所有值都严格按照约束条件。
我试过这个。请建议一个更好的算法。
#include<stdio.h>
#include<stdlib.h>
int coprime(int num1 , int num2)
{
while(num2%num1!=0)
{
int rem= num2%num1;
num2=num1;
num1=rem;
}
return (num1==1);
}
int main()
{
long int *arr , n , i=0 ,j ,k , p,flag=0,t;
puts("enter the no of elements");
scanf("%ld" ,&n);
arr=(long int*)malloc(n*sizeof(long int));
p=n;
while(i<n)
{
scanf("%ld",&arr[i]);
if(arr[i]==0)
break;
i++;
}
for(i=0 ; i<n ; i++)
{
if(!flag)
p--;
k=arr[p];
for(j=0; j<n; j++)
{
if(coprime(k,arr[j]))
{
if(coprime(k,arr[j+1]))
{
for(t=n; t>j+1 ; t--)
{
arr[t]=arr[t-1];
}
arr[j+1]=k;
j++;
}
else if(j>0&&coprime(k,arr[j-1]))
{
for(t=n; t>j ; t--)
{
arr[t]=arr[t-1];
}
arr[j]=k;
}
flag=1;
break;
}
}
}
for(i=0; i<n; i++)
printf("%ld " ,arr[i]);
return 0;
}
答案 0 :(得分:0)
这是一个非常简单的解决方案:让我们假设两次出现的数字是x
。然后答案是{x, 1, 2, 3, ..., n - 1}
。它为什么有效?任何gcd(x, 1) = 1
的{{1}}和任何x
的{{1}}。因此,这种排序是正确的。