题目链接:http://codeforces.com/problemset/problem/361/B

题目意思:有n个数,这些数的范围是[1,n],并且每个数都是不相同的。你需要构造一个排列,使得这个排列上的数与它所在位置的序号的最大公约数满足 > 1,并且这些数的个数恰好满足k个,输出这样的一个排列。

先说明什么时候得不到这样的一个排列,就是n = k的情况。因为任何一个数x放在第1个位置的gcd(x, 1) = 1的,所以要得出这样一个排列 k 最大只能为 n-1 。而k最小为0个,这个排列是n,2,3,4,...,n-1(当然也可以是2,3,...,n,n+1等等)。那么,如果k 满足 [0, n - 1]的取值范围,这样的排列绝对存在。

接着讨论一般情况下,如果构造出满足恰好有k个符合这样条件的排列。这里先声明一个规律,当某个数x放在与它下标也是x的位置上时(这个数当然不能为1),那么绝对是满足gcd(x, x) > 1的,最大公约数即是它自己。现在推出构造这个排列的规律。

假设n = 8, k = 2

下标i :   1         2         3         4         5       6      7         8

排列xi:   2         3       4         5         6         1         7         8

如果 k= 3

下标i :   1         2         3         4         5       6      7         8

排列xi:  2         3         4       5         1         6         7         8

其他依此类推,可以发现前n-k-1 个数都是从比它下标多1开始的,这样保证gcd(i, xi) = 1,而第n-k的位置填1,这样加起来恰好满足gcd(i, xi)的个数等于n-k,而最后的k个数则保持与它的下标相等。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std; int main()
{
int i, n, k;
while (scanf("%d%d", &n, &k) != EOF)
{
if (k == )
{
printf("%d ", n);
for (i = ; i < n; i++)
printf("%d ", i);
}
else if (k == n)
printf("-1\n");
else
{
for (i = ; i < n - k; i++)
printf("%d ", i+);
printf("1 ");
for (i = n-k+; i <= n; i++)
printf("%d ", i);
printf("\n");
}
}
return ;
}

最新文章

  1. MySQL mysqldump数据导出详解
  2. 关于AnimationState的测试
  3. mongoDB 3.0 安全权限访问控制
  4. 研磨设计模式解析及python代码实现——(一)简单工厂模式
  5. C++中 _itoa_s方法简介
  6. Telerik_2012_Q3 破解全套下载链接
  7. &lt;php&gt;上传文件的程序
  8. Java File 类的使用方法详解(转)
  9. crontab架构和格式
  10. 微信获取地理位置转城市demo
  11. C 输出变量值到文件中的方法
  12. 使用NSIS制作安装包
  13. Hive show
  14. MySQL NDB集群安装配置(mysql cluster 9.4.13 installation)
  15. git仓库按时间、成员等维度分析统计
  16. SpringBoot中的Quartz应用
  17. servlet ServletConfig ServletContext
  18. Linux ping命令详解
  19. DevExpress:下拉框绑定数据源 (ComboBoxEdit,LookUpEdit)
  20. angularJS 中的传参

热门文章

  1. codeforces 86D : Powerful array
  2. POJ2492 A Bug&#39;s Life
  3. JSON后端页面解析
  4. ci中与类名相同 的方法 index控制器 下面index方法 会输出两份
  5. Spring实战学习笔记之SpEL表达式
  6. 位图索引:原理(BitMap index)
  7. iOS exit(0); 直接退出程序
  8. Log4j使用教程 log4:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
  9. You should blog even if you have no readers
  10. 关于 jsonp 跨域