题解:Coprime Permutation

news/2025/2/7 22:46:57/文章来源:https://www.cnblogs.com/Kenma/p/18700812

前言

一种很新的排列计数。

思路分析

考虑将排列视作映射,初始令 \(p_i=i\),考虑哪些位置能够进行交换。

\(s_i\) 表示 \(p_i\) 的质因子集合,为了方便,考虑用元素乘积刻画这个集合。

不难发现,对于 \(s_i=s_j\) 的任意位置 \((i,j)\),它们是等价的,也就是说它们是可以任意交换不影响排列的合法性。

感性理解就是既然质因子集合相同,那么和谁求 \(\gcd\) 不影响答案。

然后很遗憾发现没做完,还有其他位置可以进行交换。

经过手模发现,对于两个质数 \(p_i=p_j\),如果 \(\lfloor \frac{n}{p_i} \rfloor= \lfloor \frac{n}{p_j} \rfloor\),也就是说 \(p_i\)\(p_j\)\([1,n]\) 的倍数个数相同,那么这些倍数可以两两对应交换。

也就是说,对于 \(a_i=0\) 的情况,是第一种情况每个等价类的大小的阶乘,乘上第二种情况每个等价类的大小的阶乘。

现在考虑,\(a_i\) 的某些位置被填上了数。

如果 \(a_i\)\(i\) 的匹配不矛盾的话,那么我们只需要在两种情况的对应等价类中删去一个元素就行。

但是有很多种情况,\(a_i\)\(i\) 的匹配会导致不存在合法排列,因此我们需要讨论一下什么时候 \(a_i\)\(i\) 的匹配不合法。

  • \(a_i\)\(i\)\(<\sqrt{n}\) 的质因子集合不相同;

  • \(a_i\)\(i\)\(\ge \sqrt{n}\) 的质因子的存在性不同;

  • \(a_i\)\(i\)\(\ge \sqrt{n}\) 的质因子在 \([1,n]\) 中的倍数个数不同。

  • \(a_i\)\(i\) 在第二种情况中的映射和之前的映射矛盾。

做完了。

使用递推质因数分解,总体复杂度 \(O(kn)\)\(k\) 是小于 \(7\) 的常数。

代码实现

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int n,a,ans,p1[1000005],ip[1000005],p2[1000005],fac[1000005],C[1000005],c[1000005],mp[1000005];
int prime[1000005],isprime[1000005],cnt;
void seive(){for(int i=2;i<=n;i++){if(!isprime[i]) prime[++cnt]=i,mp[i]=i,ip[i]=n/i;for(int j=1;j<=cnt && i*prime[j]<=n;j++){isprime[i*prime[j]]=1;mp[i*prime[j]]=prime[j];if(i%prime[j]==0) break;}}
}
vector<int> v[1000005];
int mul[1000005];
void work(int m){int a=m;mul[m]=1;for(int i=2;i*i<=a;i++){if(a%i==0){while(a%i==0) a/=i;v[m].push_back(i);mul[m]*=i;}}if(a>=2){v[m].push_back(a);mul[m]*=a;}sort(v[m].begin(),v[m].end());c[mul[m]]++;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n;seive();fac[0]=1;for(int i=1;i<=n;i++){fac[i]=fac[i-1]*i%mod;} mul[1]=c[1]=C[1]=ip[1]=1;for(int i=1;i<=cnt;i++){C[ip[prime[i]]]++;}v[1].push_back(1);for(int i=2;i<=n;i++){int tmp=i;mul[i]=1;while(tmp!=1){int p=mp[tmp];while(tmp%p==0) tmp/=p;v[i].push_back(p);mul[i]*=p; }c[mul[i]]++;}for(int i=1;i<=n;i++){cin>>a;if(a==0) continue;if(v[a].size()!=v[i].size()){cout<<0;return 0;}for(int j=0;j<v[a].size();j++){if(ip[v[a][j]]!=ip[v[i][j]]){cout<<0;return 0;}}int x=v[i].back(),y=v[a].back();if(p1[x] && p1[x]!=y){cout<<0;return 0;}if(p2[y] && p2[y]!=x){cout<<0;return 0;}if(!p1[x] && !p2[y]){p1[x]=y;p2[y]=x;C[ip[y]]--;}c[mul[a]]--;} ans=1;for(int i=1;i<=n;i++){ans=ans*fac[C[i]]%mod*fac[c[i]]%mod;}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880267.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Duplicate Cleaner : 这款神器一键干掉重复文件

在如今这个数字时代,我们的电脑里存储着海量的文件。随着时间的推移,重复文件也越来越多,不仅占用宝贵的磁盘空间,还会让文件管理变得一团糟。 今天,就给大家介绍一款能轻松解决这一难题的神器 ——Duplicate Cleaner。Duplicate Cleaner 有普通版和功能更强大的 Pro 版。…

Doggo:一款友好的命令行DNS查询工具

一、基本概述 Doggo是由Karan Sharma使用Go语言开发的现代命令行DNS客户端工具,旨在以简洁、直观的方式输出DNS查询结果。它类似于传统的dig命令,但提供了更为现代化和易读的输出格式。 https://github.com/mr-karan/doggo二、主要特点 1、支持多种协议: Doggo不仅支持传统的…

uniapp 移动端(ios)uview2.0 u-input 插槽问题

这个插槽太奇怪了,非得加上对于的属性才能使用。<u-input class="u-input" prefixIcon="search" suffix-icon="search" placeholder="请输入验证码" type="text" border="surround"color="#fffffff0&quo…

DeepSeek-R1 技术全景解析:从原理到实践的“炼金术配方” ——附多阶段训练流程图与核心误区澄清

字数:约3200字|预计阅读时间:8分钟(调试着R1的API接口,看着控制台瀑布般流淌的思维链日志)此刻我仿佛看到AlphaGo的棋谱在代码世界重生——这是属于推理模型的AlphaZero时刻。 DeepSeek 发布的 V3、R1-Zero、R1 三大模型,代表了一条从通用基座到专用推理的完整技术路径。…

注解反射之获得Class对象

获得Class对象是实现反射的基础,获得Class对象主要有三种方式 下面是具体实例package com.loubin;import java.lang.annotation.*;public class Main {public static void main(String[] args) throws ClassNotFoundException {Class c = User.class;User user = new User();…

注解反射之获得Class对象介绍

啥是Class对象 专业的详细的科学的规范的解释百度就可以获得,这里写能让自己直观理解的介绍吧。当我们运行程序时,系统会将类加载到内存,同时,会给每个类分配一个Class的对象,这个Class的对象拥有关于这个类的一切描述,就好像人的名片一样。每一个类对应一个唯一的Class对…

java面试心得体会

1.背景 大家有没有感觉到现在就算背诵了很多面试八股文,也刷了B站上很多的面试视频,绝大部分的面试题也基本上都能回答上,但是找工作却越来越难了,是因为自己没有学好么,当然不是很多人认为是经济不好,招聘的单位少,其实我个人觉得也不是最主要的原因估计是学习java编程的人太多…

注解反射之自定义注解

自定义注解主要是要掌握四个元注解@Target, @Retention,@Documented,@Inherited,他们的意思分别如下 下面是一个具体的例子,注意注释定义中的 String name()并不是定义一个name方法,而是定义一个name属性,该属性的类型是Stringpackage com.loubin;import java.lang.ann…

【CTF笔记】文件上传漏洞

一、后门代码 1、一句话后门 <?php @eval($_get[cmd]); ?> <?php @eval($_request[cmd]);?> <script language="php">@eval($_post[cmd]);</script>注意,在PHP中配置 short_open_tag=on 时,图片中不能含有 <? ,有会影响PHP代码的…

​​2025年中非人工智能产业发展论坛征文来了!网络空间安全专业论文投稿建议(附文件全文)

2025年中非人工智能产业发展论坛征文来了!网络空间安全专业论文投稿建议(附文件全文)2025年中非人工智能产业发展论坛由广西产学研科学研究院、天津科学技术出版社、马里共和国驻华大使馆等单位联合举办,南宁市人工智能学会、IRNet国际学术交流中心承办,拟于2025年9月召开…

Tita 项目管理:前后置业务流程的得力助手

在当今竞争激烈的商业环境中,高效的项目管理对于企业的成功至关重要。而项目前后置业务流程的顺畅运作,更是决定项目成败的关键因素。接下来,让我们一起看看项目前后置业务流程的常见应用场景,以及 Tita 项目管理产品如何发挥重要作用。 项目启动前:精准规划,奠定成功基础…

P3405 [USACO16DEC] Cities and States S(哈希算法)

总的来说这是一道简单的哈希算法,由于是字符串,所以哈希编码时只用乘26就行了