CF698F Coprime Permutation
题意:求有多少种符合要求的排列满足对于所有i,j,当gcd(i,j)=1时,gcd(pi,pj)=1。
排列上的一些位置给出。
标程:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=;
int n,p[N],cnt[N],Cnt[N],base[N],To1[N],To2[N],jc[N],x,ans;
vector<int> fac[N];
void fail(){puts("");exit();}//这个东西超级好用!
void shai()
{
for (int i=;i<=n;i++)
if (!p[i])
{
cnt[n/i]++;
for (int j=i;j<=n;j+=i)
{
p[j]=;base[j]*=i;
fac[j].push_back(i);
}
}
}
void check(int x,int y)
{
if (fac[x].size()!=fac[y].size()) fail();
for (int i=;i<fac[x].size();i++)
{
int fu=fac[x][i],fv=fac[y][i];
int u=(x==)?:n/fu,v=(y==)?:n/fv;
if (u!=v) fail();
if (To1[fu]&&To1[fu]!=fv) fail();
if (To2[fv]&&To2[fv]!=fu) fail();
if (!To2[fv]) To1[fu]=fv,To2[fv]=fu,cnt[u]--;
}
Cnt[base[x]]--;
}
int main()
{
scanf("%d",&n);
jc[]=;cnt[]=;//1和所有数互质!!!
for (int i=;i<=n;i++) jc[i]=(ll)jc[i-]*i%mod,base[i]=;
shai();fac[].push_back();//!!!
for (int i=;i<=n;i++) Cnt[base[i]]++;
for (int i=;i<=n;i++)
{
scanf("%d",&x);
if (x) check(i,x);
}
ans=;
for (int i=;i<=n;i++)
ans=(ll)ans*jc[cnt[i]]%mod*jc[Cnt[i]]%mod;
printf("%d\n",ans);
return ;
}
易错点: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的更多相关文章
- Codeforces 698F - Coprime Permutation(找性质)
Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...
- Codeforces Round 363 Div. 1 (A,B,C,D,E,F)
Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...
- Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Palindrome Permutation II 回文全排列之二
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
- [LeetCode] Palindrome Permutation 回文全排列
Given a string, determine if a permutation of the string could form a palindrome. For example," ...
- [LeetCode] Permutation Sequence 序列排序
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 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 ...
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
随机推荐
- 高效IO之Java IO体系(一)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 个人觉得可以用“字节流操作类和字符流操作类组成了Java IO体系”来高度概括J ...
- Java split的用法
java.lang.string.split split 方法 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separator,[limit]]) s ...
- C语言结构体嵌套
#include <stdio.h> int main() { /*************************************************** *结构体嵌套:结构 ...
- Kettle 中的循环
说道循环,小伙伴们肯定不陌生,就是重复干一件事:而kettle中的循环一般是发生在job中,因为job是串行执行的: kettle的循环有两种,一种是通过js脚本,另外一种是通过遍历前面步骤返回的每一 ...
- 12_通过 CR3 切换_读取指定进程数据
注意: cr3 切换 ,导致eip 指向的页面,改变为对应cr3 的页面:所以代码也变了:这里需要将这部分代码放入公共区域. 解决: 使用 类似前面 山寨 systemfastcallentry 的方 ...
- JS window对象 取消计时器clearTimeout() setTimeout()和clearTimeout()一起使用,停止计时器。 语法: clearTimeout(id_of_setT
取消计时器clearTimeout() setTimeout()和clearTimeout()一起使用,停止计时器. 语法: clearTimeout(id_of_setTimeout) 参数说明: ...
- java web应用用户上传图片的存储地址
原来工程的上传图片存储地址在web应用的目录下,并且是硬编码到其中的: 每次使用maven tomcat:redeploy以后,这个目录就没有了. 现在想要把上传图片的位置移动到tomcat的weba ...
- leetcode-并查集
- 题目:130 并查集: class Solution: def solve(self, board: List[List[str]]) -> None: """ ...
- CSS四种定位及应用
定位(position) 如果,说浮动, 关键在一个 “浮” 字上面, 那么 我们的定位,关键在于一个 “位” 上. PS: 定位是我们CSS算是数一数二难点的了,但是,你务必要学好它,我们CSS离不 ...
- <转载>深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别
C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,因此,刻意再次深入探究了指针和数组这玩意儿,其他类型的数组比较简单,容易混淆的是字符数组和字符指针这两个 ...