AtCoder Beginner Contest 230 G. GCD Permutation(容斥/莫比乌斯反演 补写法)

题目

给定长为n(n<=2e5)的1-n的排列p,

求(i,j)(1<=i<=j<=n)对的数量,满足gcd(i,j)≠1且gcd(pi,pj)≠1

思路来源

官方题解

题解

参考莫比乌斯函数mu,定义一个新函数,

新函数需要满足n=1的时候对因子求和为0,大于1的时候对因子求和为1,

就能将gcd(i,j)≠1展开为新函数了

然后发现,实际上就是,

之前n>=2的时候,因子mu之和为0,

由于gcd不能为1,要忽略mu[1]的贡献,

那么0减掉mu[1]之后是-1,取反之后即为1,

所以相当于把之前奇偶因子的符号取反

枚举i和i的倍数j,所有倍数j需要反演得到i固定时的答案,

此时这些j已经满足gcd(j1,j2)≠1,第二个条件需要再套一次反演

把这些pj塞入vector,再做一次反演即可

一共有x个数时,任意取两个,可以重复取,

等价于有x个数和一个空位,这x+1个数取两个

取到了一个数和一个空位的时候,就认为是取了两次相同的数

代码1(容斥)

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=2e5+10;
int n,p[N],a[N];
vector<int>fac[N],tmp;
map<int,ll>bs;
ll dp[N],f[N],res;
//x内任取两个 gcd大于1的(i,j)方案数
ll cal(vector<int>&x){bs.clear();for(auto &v:x){for(auto &d:fac[v]){bs[d]++;}}int c=0;for(auto &x:bs){x.se=1ll*x.se*(x.se+1)/2;a[++c]=x.fi;f[x.fi]=x.se;}ll ans=0;//printf("c:%d v:%d\n",c,a[1]);per(i,c,1){int v=a[i];if(v==1)break;ll w=f[v];for(auto &d:fac[v]){f[d]-=w;}ans+=w;}return ans;
}
int main(){sci(n);rep(i,1,n)sci(p[i]);rep(i,1,n){for(int j=i;j<=n;j+=i){fac[j].pb(i);}}per(i,n,2){tmp.clear();for(int j=i;j<=n;j+=i){tmp.pb(p[j]);}dp[i]=cal(tmp);//printf("i:%d dp1:%lld\n",i,dp[i]);for(int j=2*i;j<=n;j+=i){dp[i]-=dp[j];}//printf("i:%d dp2:%lld\n",i,dp[i]);res+=dp[i];}printf("%lld\n",res);return 0;
}

代码2(反演)

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=2e5+10;
int n,p[N],a[N],mu[N];
vector<int>fac[N],tmp;
ll dp[N],bs[N],f[N],res;
//x内任取两个 gcd大于1的(i,j)方案数
ll cal(vector<int>&x){for(auto &v:x){for(auto &d:fac[v]){if(!mu[d])continue;bs[d]++;}}ll ans=0;for(auto &v:x){for(auto &d:fac[v]){if(!bs[d] || d==1 || !mu[d])continue;bs[d]=1ll*bs[d]*(bs[d]+1)/2;ans-=mu[d]*bs[d];bs[d]=0;}}return ans;
}
int main(){sci(n);rep(i,1,n)sci(p[i]);mu[1]=1;rep(i,1,n){fac[i].pb(i);for(int j=2*i;j<=n;j+=i){mu[j]-=mu[i];fac[j].pb(i);}}per(i,n,2){if(!mu[i])continue;tmp.clear();for(int j=i;j<=n;j+=i){tmp.pb(p[j]);}dp[i]=cal(tmp);res-=mu[i]*dp[i];//printf("i:%d dp1:%lld\n",i,dp[i]);// for(int j=2*i;j<=n;j+=i){//     dp[i]-=dp[j];// }// //printf("i:%d dp2:%lld\n",i,dp[i]);// res+=dp[i];}printf("%lld\n",res);return 0;
}

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

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

相关文章

Stable Diffusion 模型下载:DreamShaper XL(梦想塑造者 XL)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 DreamShaper 是一个分格多样的大模型&#xff0c;可以生成写实、原画、2.5D 等…

你每天关电脑吗

有人说&#xff0c;不关电脑&#xff0c;就如同特警的汽车&#xff0c;从来不熄火&#xff0c;这样有事可以最快的响应。 做大事&#xff0c;不要怕费那点电&#xff08;汽油&#xff09;。 那么还有什么原因呢&#xff1f; 且看—— 程序员为何不喜欢下班后关闭电脑&#…

假期作业 9

1.用指针实现strlen、strcpy、strcat、strcmp 代码&#xff1a; #include <stdio.h> #include <string.h> int mystrlen(char *str); int mystrcmp(char *str1,char *str2); char *mystrcat(char *str1,char *str2); char *mystrcpy(char *str1,char *str2); int…

【Linux】基础命令 第二篇

目录 echo 输出重定向:(本质都是写入) 输入重定向cat more 指令 && less指令 head && tail && 管道初步使用 grep&#xff1a;行文本过滤工具&#xff08;文本按行搜索&#xff09; date&#xff1a;获取时间 date 命令用于 显示 或 设置系统的…

【原创 附源码】Flutter安卓及iOS海外登录--Apple登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

Go-zero微服务个人探究之路(十二)定时任务的选择调研

前言 很多时候后台需要做定时任务的需求&#xff0c;笔者的项目采用go-zero框架微服务框架&#xff0c;需要做定时任务&#xff0c;于是做了如下方法调研&#xff0c;共有大概三种主要选择 方案 难度总体由容易到复杂 go的timer库 通过Go的标准库time中的Ticker和Tick功能…

【C++ 02】类和对象 1:初识类和对象

文章目录 &#x1f308; Ⅰ 面向对象介绍&#x1f308; Ⅱ 类的引入&#x1f308; Ⅲ 类的定义格式1. 声明和定义不分离2. 声明和定义分离 &#x1f308; Ⅳ 类的访问限定符&#x1f308; Ⅴ 类的作用域&#x1f308; Ⅵ 类的实例化&#x1f308; Ⅶ this 指针 &#x1f308; Ⅰ…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Fil&#xff4d; Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Fil&#xff4d; Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日&#xff0c;让我们得以一窥新创意时代的风采。从众多参赛作品中…

ChatGPT高效提问—prompt实践(视频制作)

ChatGPT高效提问—prompt实践&#xff08;视频制作&#xff09; 1.1 视频制作 ​ 制作视频对于什么都不懂的小白来说非常难。而随着AI技术的发展&#xff0c;这件事变得越来越简单&#xff0c;如今小白也可以轻松上手。如何借助ChatGPT来制作短视频。 ​ 其实方法非常简单&a…

《UE5_C++多人TPS完整教程》学习笔记12 ——《P13 加入游戏会话(Joining The Sessions)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P13 加入游戏会话&#xff08;Joining The Session&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是…

【操作系统】3.操作系统的运行环境

3.操作系统的运行环境 3.1.操作系统的运行机制 计算机系统中&#xff0c;通常CPU执行两种不同性质的程序&#xff1a; 操作系统内核程序 用户自编程序&#xff0c;即系统外层的应用程序&#xff0c;或简称“应用程序” 对操作系统而言&#xff0c;这两种程序的作用不同——前…

贪心算法入门题(算法村第十七关青铜挑战)

青铜挑战&#xff1a;贪心其实很简单 贪心算法&#xff08;贪婪算法&#xff09;是指在对问题进行求解时&#xff0c;在每一步选择中都采取最好或者最优的选择&#xff0c;从而希望能够导致结果是最好或者最优的算法。 贪心算法要么得到最优解&#xff0c;要么得到近似最优解…

手把手教你开发Python桌面应用-PyQt6图书管理系统-修改密码UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理

通过“添加自定义菜单”来学习menuconfig图形化配置原理&#xff0c;将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”&#xff0c;此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”&#xff0c;此配置项处于菜单“My test m…

Spring Security实现权限认证与授权

一、Spring Security Spring Security作为Spring家族的安全框架&#xff0c;在安全方面的两个核心功能是认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;。 &#xff08;1&#xff09;用户认证指的是&#xff1a;验证某个用户是否为系…

【Java程序设计】【C00265】基于Springboot的地方废物回收机制管理系统(有论文)

基于Springboot的地方废物回收机制管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的地方废物回收机构管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后…

假期day8多进程与多线程(2024/2/11)

多进程服务器 #include<myhead.h> #define PORT 9999 //端口号 #define IP "192.168.125.113" //IP地址//定义信号处理函数&#xff0c;用于回收僵尸进程 void handler(int signo) {if(signo SIGCHLD){while(waitpid(-1, NULL, WNOH…

EXCEL中如何调出“数据分析”的菜单

今天发现&#xff0c;原来WPS还是和EXCEL比&#xff0c;还是少了“数据分析”这个日常基本做统计的菜单&#xff0c;只好用EXCEL了&#xff0c;但奇怪发现我的EXCEL中没发现这个菜单&#xff0c;然后查了下&#xff0c;才发现&#xff0c;要用如下的方法打开&#xff1a; 1&…

Go+:一种简单而强大的编程语言

Go是一种简单而强大的编程语言&#xff0c;它是在Go语言之上构建的&#xff0c;旨在提供更加强大、灵活和易于使用的编程体验。Go与Go语言共享大部分语法和语义&#xff0c;因此Go开发人员可以很快上手Go&#xff0c;同时也可以使用Go来编写更加简洁和高效的代码。在本文中&…