AtCoder-abc230_g GCD Permutation 容斥
J - GCD Permutation
传送门: J - GCD Permutation
知识点:素数筛、容斥定理、gcd
题意:长度为n的一个排列a中,求满足\(gcd(i,j)!=1 且 gcd(a_i,a_j)!=1\)的i,j对数。i,j可以相同。n<=2e5
解法:
根据埃氏筛的原理,我们知道1到n的所有倍数的总数是O(n)级别的。因此,我们可以2到n枚举作为因子的k,那么他的所有倍数两两不互质。显然这种方法枚举出来的数字总数是O(n)级别。
得到了k的倍数后,已经解决了gcd(i,j)!=1的条件。如果对这些倍数位置上的数字两两判断gcd的话一定会超时,因为单单是2的倍数就有1e5,不可以跑\(n^2\)的写法。
那么我们就要快速解决在k倍位置上有多少对贡献。两个数不互质是一定有共同的因子,可以把每个数的因子分离出来,分别计数,用map存储。
如果分离出来了x个2,y个3,z个6,那么以2作为公共因子的有x(x-1)/2对,以3作为公共因子的有y(y-1)/2对。分别计入答案之后发现2,3作为因子的贡献中,6作为因子的贡献重复了,所以还要减去6的贡献z(z-1)。
以此类推,这个问题就要用容斥来解决了。质因子数量是奇数的数字加入答案,是偶数的数字从答案扣除。含有同一质因子多次的的数字跳过。因为我们先统计了质因子的答案,然后要去掉含两个不同质因子的答案,加回来含三个不同质因子的答案。。。
这样我们就解决了k为i,j因子的贡献,同理,k=2与k=3会重复计算k=6部分的贡献,所以也要再跑一边容斥。
这样跑完得到的是不含i,j相同情况的答案,再扫一遍就行了。
#include <bits/stdc++.h>
using namespace std;
#define yaqujiejie yyds
typedef long long ll;
#define int long long
const int N = 2e5+10;
vector<int>prime;//存储素数
vector<int>yz[N];//因子
vector<int>bs[N];//倍数
bool nop[N];//不是素数
bool no[N];//不可
int yzs[N];//质因数数量
void init(){
for(int i=2;i<N;i++){
if(!nop[i]){
if(i*i<N&&i*i>0)no[i*i]=1;
prime.push_back(i);
yzs[i]++;
for(int j=i*2;j<N;j+=i){
nop[j]=1;
yzs[j]++;
ll k=(ll)i*i;
if(j%k==0)no[j]=1;
}
}
yz[i].push_back(i);
bs[i].push_back(i);
for(int j=i*2;j<N;j+=i){
yz[j].push_back(i);
bs[i].push_back(j);
}
}
}
int a[N];
signed main(){
ios::sync_with_stdio(false);
init();
int n;cin>>n;
ll ans=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int k=2;k<=n;k++){
unordered_map<int,int>mp;
for(int j=0;j<bs[k].size();j++){
for(int u=0;u<yz[a[bs[k][j]]].size();u++){
mp[yz[a[bs[k][j]]][u]]++;
}
}
ll res=0;
for(auto p:mp){
if(no[p.first])continue;
if(yzs[p.first]%2==1)res+=p.second*(p.second-1)/2;
else res-=p.second*(p.second-1)/2;
}
if(no[k])continue;
if(yzs[k]%2==1)ans+=res;
else ans-=res;
}
for(int i=2;i<=n;i++)if(a[i]!=1)ans++;
cout<<ans<<"\n";
}
AtCoder-abc230_g GCD Permutation 容斥的更多相关文章
- HihoCoder - 1867: GCD (莫比乌斯容斥)
Sample Input 6 1 6 2 5 3 4 Sample Output 10 You are given a {1, 2, ..., n}-permutation a[1], a[2], . ...
- HDU 1695 GCD(容斥定理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- ZOJ 3868 GCD Expectation (容斥+莫比乌斯反演)
GCD Expectation Time Limit: 4 Seconds Memory Limit: 262144 KB Edward has a set of n integers {a1 ...
- E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)
题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...
- hdu 1695 GCD(容斥)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...
- Codeforces 585E. Present for Vitalik the Philatelist(容斥)
好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...
- HDU 1695 GCD 容斥
GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...
- hdu 1695 GCD 容斥+欧拉函数
题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...
- GCD HDU - 1695 (欧拉 + 容斥)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 5656 CA Loves GCD (容斥)
题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...
随机推荐
- 利用 fastjson 的 toJSONStringWithDateFormat 方法,将Date 格式化 为常见类型的时间
利用 fastjson 的 toJSONStringWithDateFormat 方法,将Date 格式化 为常见类型的时间 JSON.toJSONStringWithDateFormat(nrcSt ...
- Vue 解决因网络延时 页面中的{{XXX}}模板直接展示在用户面前,配合v-cloak指令
v-cloak指令: 1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉 v-cloak属性 2.使用 CSS配合v-cloak可以解决网速慢时,页面展示出{{XXX}}模板的问题 案例: ...
- drf从入门到飞升仙界 02
restful规范 # restful是一种定义web API接口的设计风格,适用于前后端分离的应用模式中 # 关于restful的10个规范 -1.数据的安全保障,通常使用https协议(http+ ...
- React脚手架的使用
初始化项目 npx create-react-app my-app // 或 npm init react-app my-app // 或 yarn create react-app my-app 启 ...
- 苹果电脑快捷键使用 Mac快捷键大全详细介绍
相信有很多刚开始使用苹果电脑操作系统的用户,都并不了解整个MAC操作系统,就连一般快捷键的使用都不清楚,这让人很感觉很苦恼.分享一下Mac快捷键大全的详细介绍,记住这些常用的快捷键,是你熟悉苹果电脑的 ...
- css - contenteditable
css - contenteditable contenteditable属性 contenteditable 属性是 HTML5 中的新属性.规定是否可编辑元素的内容. 让contenteditab ...
- MySQL-explain详解说明
1.Explain介绍 在日常工作中, 我们会有时会开慢查询去记录一些执行时间比较久的SQL语句, 找出这些SQL语句后我们常常会用explain这个命令来查看一个这些SQL语句的执行计划, 查看该S ...
- *args、**kwargs参数组
'''def test(*args): # *agrs接收的是N个位置参数,不能接受关键字参数,转化成元祖 print(args)test(1,2,3,4,5,6)test(*[1,2,4,5,5]) ...
- 问题:PHP扩展功能,去掉分号';'没有用,是怎么回事?(已解决)
1. 环境:win10的操作系统,IIS的服务器. 2. 问题描述:PHP要开启访问MYSQL的模块mysqli,我打开配置文件,去掉相关扩展模块前面的分号';',然后重启服务器,但是无效 ~~ 3. ...
- 【python】绘图,颜色,线型
颜色 最好用的:在网站上找到对应使用十六进制RGB/RGBA字符串表示颜色 可以看颜色及其对应色号名称:https://xkcd.com/color/rgb/ 参考:matplotlib指定绘图颜色的 ...