HDU 5916 Harmonic Value Description (2016-ccpc-长春)
题目连接:题目
题目大意:
给出N,K,给你1~n个数,在所有全排列中相邻的两个数的gcd的和第K大的排列,排列有多种,输出其中一种
解题思路:
设,p是左右gcd的和,则p是从n-1,开始的连续数字
当k==1时就是输出从1~n
当k时偶数时,把k和2*k提到最前面,因为k和2*k的最大公约数时k,别的数都不影响,他们的最大公约数还是1,所以p时k+n-2,也就是从n-1开始数的第K个数
当k时奇数时,把前k个奇数提前,偶数的gcd就变成2,p就增加了k个
#include<cstdio> #include<algorithm> using namespace std; int a[10000+10]; int main(){ //freopen("t.txt","r",stdin); int t; scanf("%d",&t); for(int p=1;p<=t;p++){ for(int i=1;i<=10000;i++) { a[i]=i; } printf("Case #%d: ",p); int n,k; scanf("%d%d",&n,&k); if(k==1) {for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);} if(k%2==0){ printf("%d %d",k,2*k); for(int i=1;i<=n;i++){ if(i==k || i==2*k) continue; printf(" %d",a[i]); } printf("\n"); } if(k%2==1&&k!=1){ printf("3"); a[3]=0; for(int i=2;i<k;i++){ printf(" %d",i*2+1); a[i*2+1]=0; } for(int i=1;i<=n;i++){ if(a[i]==0) continue; printf(" %d",a[i]); } printf("\n"); } } return 0; }