题意:求有多少种符合要求的排列满足对于所有i,j,当gcd(i,j)=1时,gcd(pi,pj)=1。

排列上的一些位置给出。

标程:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int mod=1e9+;
  5. const int N=;
  6. int n,p[N],cnt[N],Cnt[N],base[N],To1[N],To2[N],jc[N],x,ans;
  7. vector<int> fac[N];
  8. void fail(){puts("");exit();}//这个东西超级好用!
  9. void shai()
  10. {
  11. for (int i=;i<=n;i++)
  12. if (!p[i])
  13. {
  14. cnt[n/i]++;
  15. for (int j=i;j<=n;j+=i)
  16. {
  17. p[j]=;base[j]*=i;
  18. fac[j].push_back(i);
  19. }
  20. }
  21. }
  22. void check(int x,int y)
  23. {
  24. if (fac[x].size()!=fac[y].size()) fail();
  25. for (int i=;i<fac[x].size();i++)
  26. {
  27. int fu=fac[x][i],fv=fac[y][i];
  28. int u=(x==)?:n/fu,v=(y==)?:n/fv;
  29. if (u!=v) fail();
  30. if (To1[fu]&&To1[fu]!=fv) fail();
  31. if (To2[fv]&&To2[fv]!=fu) fail();
  32. if (!To2[fv]) To1[fu]=fv,To2[fv]=fu,cnt[u]--;
  33. }
  34. Cnt[base[x]]--;
  35. }
  36. int main()
  37. {
  38. scanf("%d",&n);
  39. jc[]=;cnt[]=;//1和所有数互质!!!
  40. for (int i=;i<=n;i++) jc[i]=(ll)jc[i-]*i%mod,base[i]=;
  41. shai();fac[].push_back();//!!!
  42. for (int i=;i<=n;i++) Cnt[base[i]]++;
  43. for (int i=;i<=n;i++)
  44. {
  45. scanf("%d",&x);
  46. if (x) check(i,x);
  47. }
  48. ans=;
  49. for (int i=;i<=n;i++)
  50. ans=(ll)ans*jc[cnt[i]]%mod*jc[Cnt[i]]%mod;
  51. printf("%d\n",ans);
  52. return ;
  53. }

易错点:1.注意1和所有数互质,所以cnt[1]=1,表示1~n和1不互质的只有1个数。

2.fac[1].push_back(1),1有一个因数为1,小心判错。

题解:数学+性质

一开始我想分别求出与每个数互质的数的个数,较难。

发现可以从什么样的数相互交换等价入手:1.两个数的因数种类完全一样。2.若质数p1,p2,且[n/p1]=[n/p2]时,即1~n中所有p1的倍数和p2的倍数可以一一对应,那么对应互换。这两个交换相互独立。

如果没有固定元素这样就结束了。

判断合法性:

1.两个元素的因数去重后的个数要一样。

2.两个限制可以合并为对应因数的出现次数一样。

3.质因子之间产生轮换,可以会产生矛盾,要判掉。

最后减去已经确定的答案。

实现的时候有一些小技巧:

1.比较因数种类完全一样时,相当于比较两个数所有质因子的一次乘积。

2.可以用素数筛求出所有质数并筛出每个数的因数种类。

3.当p1,p2<=n^0.5时,[n/p1]与[n/p2]必然不等。

CF698F Coprime Permutation的更多相关文章

  1. Codeforces 698F - Coprime Permutation(找性质)

    Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...

  2. Codeforces Round 363 Div. 1 (A,B,C,D,E,F)

    Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...

  3. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  4. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  5. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  6. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  7. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. Leetcode 60. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  9. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

随机推荐

  1. 通过java api 读取sql 中数据(查询)

    配置文件:dbconfig.properties 里面的数据 jdbc.url.jwhat=jdbc\:mysql\://ip\:3306/laibadev?useUnicode\=true& ...

  2. 2019-4-29-.NET-Standard

    title author date CreateTime categories .NET Standard lindexi 2019-4-29 12:7:26 +0800 2018-2-13 17:2 ...

  3. who - 显示已经登录的用户

    总览 (SYNOPSIS) who [OPTION]... [ FILE | ARG1 ARG2 ] 描述 (DESCRIPTION) -H, --heading 显示 栏目行 -i, -u, --i ...

  4. tomcat启动内存修改

    #   USE_NOHUP       (Optional) If set to the string true the start command will #                   ...

  5. 笔记38 Spring Web Flow——订单流程(定义基本流程)

    做一个在线的披萨订购应用 实际上,订购披萨的过程可以很好地定义在一个流程中.我们首先从 构建一个高层次的流程开始,它定义了订购披萨的整体过程.接下 来,我们会将这个流程拆分成子流程,这些子流程在较低的 ...

  6. 带你彻底理解RSA算法原理,很简单的

    1. 什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法. 在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为 对称密码 和 公钥密码 对称 ...

  7. react 路由使用react-router-dom

    react 和vue一样都是使用封装history 来进行页面跳转,下面就来说一下react常用的路由插件react-router-dom这个东西在GitHub上 目前是最受欢迎的 首相还是先下载 n ...

  8. Dubbo的初步理解和使用

    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1]  Spring框架无缝集成. Dubbo是一款 ...

  9. JAVA 调用c++ 扩展 批评那些垃圾,

    //本人喜欢用命令行的方式,这样好理解原理 { 1 生成的要是X64 并且是release版本 不要预编译头的dll项目,就是创建的时是一个空dll项目 2 java 调用时要import com.m ...

  10. CSS四种定位及应用

    定位(position) 如果,说浮动, 关键在一个 “浮” 字上面, 那么 我们的定位,关键在于一个 “位” 上. PS: 定位是我们CSS算是数一数二难点的了,但是,你务必要学好它,我们CSS离不 ...