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 容斥的更多相关文章

  1. 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], . ...

  2. HDU 1695 GCD(容斥定理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. ZOJ 3868 GCD Expectation (容斥+莫比乌斯反演)

    GCD Expectation Time Limit: 4 Seconds     Memory Limit: 262144 KB Edward has a set of n integers {a1 ...

  4. E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)

    题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...

  5. hdu 1695 GCD(容斥)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...

  6. Codeforces 585E. Present for Vitalik the Philatelist(容斥)

    好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...

  7. HDU 1695 GCD 容斥

    GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...

  8. 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, ...

  9. GCD HDU - 1695 (欧拉 + 容斥)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. HDU 5656 CA Loves GCD (容斥)

    题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...

随机推荐

  1. 【基础】为何odd negative scaling会导致Unity动态合批失败?

    https://blog.csdn.net/weixin_41885426/article/details/109817466

  2. 为什么MeshLambertMaterial和MeshPongMaterial不可见

    在编程时发现对于同样的球体,MeshBasicMaterial可见,但是MeshLambertMateril和MeshPongMaterial不可见. 原因是这两种材质需要光照才能显示. 如果加了光照 ...

  3. 关于echart折线图只有2个点时的平滑曲线问题

    问题描述: 折线图,设置平滑曲线,多个点时没有问题, 可当只有两个点(数据)的时候,这时光靠 smooth: true  就不管用了. 解决方法: 还另需设置   smoothMonotone 单调性 ...

  4. linux格式化文件命令

    一些文件被windows打开后代码格式会被改变,使用一下命令来转换 sed -i 's/\r//' filename

  5. HTML实战:个人信息登记表

    效果展示: 代码示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. css如何实现(animation)跑马灯效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. *args、**kwargs参数组

    '''def test(*args): # *agrs接收的是N个位置参数,不能接受关键字参数,转化成元祖 print(args)test(1,2,3,4,5,6)test(*[1,2,4,5,5]) ...

  8. 解决通过Eclipse启动Tomcat-Run On Server无法选择Tomcat v7.0的问题

    在eclipse中配置Tomcat并启动右键项目 -> Run As -> Run on Server可能会出现无法选择Tomcat v7.0的现象如下图,不慌菜鸟小编带你解决!1.定位到 ...

  9. mysql剪贴板

    // mysql 8.0 连接数据源的配置文件 <!--数据源--><bean id="dataSource" class="com.alibaba.d ...

  10. 操作系统|03.Linux基础(2)

    Linux基础(二) 3.vim编辑器 命令模式:控制光标移动,对文本进行删除.复制.粘贴等工作.编辑模式:正常的文本录入.末行模式:保存.退出和设置编辑环境. 3.1命令模式常用命令 -r:恢复系统 ...