题意:求有多少种符合要求的排列满足对于所有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]必然不等。

最新文章

  1. window.location.href 中文乱码问题。。。。
  2. web缓存
  3. FlyCapture2 fc2Image OpenCV IplImage Conversion 两种图像格式之间的转换
  4. ASP.NET C#_HTML练习
  5. 【Base64&amp;UrlEncode】
  6. 读取Jar包中的资源问题探究
  7. hdu 2821 Pusher (dfs)
  8. JavaWeb 学习的第一阶段总结
  9. 3Sum Closest 解答
  10. JProgressBar的一个框架
  11. PHP的日志记录-错误与异常记录
  12. win10激活(免费+永久)视频教程
  13. 面试官让你讲讲acks参数对消息持久化的影响
  14. 12、多线程:Threading、守护线程
  15. SQL记录-PLSQL基本语法与数据类型
  16. CAS缺点
  17. Android - fragment Manager
  18. hdu3374解题报告
  19. FTP服务器原理(转)
  20. 高速Android开发系列通信篇之EventBus

热门文章

  1. JUC源码分析-集合篇(九)SynchronousQueue
  2. 回退ios版本
  3. es概念一句话简介和注意点
  4. 高级UI晋升之触摸事件分发机制(一)
  5. 如何用json 与jsonp 的区别去回答你的面试官?
  6. BeanUtils.copyProperties用法
  7. python 将字符串转换成字典dict
  8. python基础小点
  9. [模板]PAM
  10. 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)