博客
关于我
codeforces803F 2100分容斥原理 + 莫比乌斯函数
阅读量:283 次
发布时间:2019-03-03

本文共 1460 字,大约阅读时间需要 4 分钟。

题意:

给你 \dpi{150}n 个数的序列 \dpi{150}a ,问你 gcd = 1 的子序列方案数。

数据范围: 1 \leqslant n \;,\; a_i \leqslant 10^5 。

题解:

ans = cal(num[1]) - \sum cal(num[p]) + \sum cal(num[k])

p 的质因子个数是奇数个,且没有相同的质因子。

\dpi{150} k 的质因子个数是偶数个,且没有相同的质因子。

num[i] 表示序列中 i 的倍数的个数。

cal(x) 表示 x 个数形成的非空集合的个数。

这就是莫比乌斯函数。

感受:

关键是分析本质不同的质因子。

代码:

#include
using namespace std;typedef long long ll ;const int maxn = 1e5 + 5 ;const ll mod = 1e9 + 7 ;int n , cnt[maxn] , num[maxn] ;bool vis[maxn] ;int prime[maxn] ;int mu[maxn] ;void get_mu(){ int up = 1e5 ; int cnt = 0 ; mu[1] = 1 ; for(int i = 2 ; i <= up ; i ++) { if(!vis[i]) prime[++ cnt] = i , mu[i] = -1 ; for(int j = 1 ; j <= cnt && prime[j] * i <= up ; j ++) { vis[prime[j] * i] = 1 ; if(i % prime[j] == 0) break ; else mu[i * prime[j]] = -mu[i] ; } }}void init(){ int up = 1e5 ; num[1] = n ; for(int i = 2 ; i <= up ; i ++) for(int j = i ; j <= up ; j += i) num[i] += cnt[j] ;}ll qpow(ll a , ll b){ ll ans = 1 ; a %= mod ; while(b) { if(b & 1) ans = (ans * a) % mod ; b >>= 1 , a = (a * a) % mod ; } return ans % mod ;}ll cal(int x){ ll ans = 0 ; ans = qpow(2ll , ll(x)) ; ans = (ans - 1 + mod) % mod ; return ans ;}void solve(){ int up = 1e5 ; ll ans = cal(num[1]) ; for(int i = 2 ; i <= 1e5 ; i ++) { ans += ll(mu[i]) * cal(num[i]) ; ans %= mod ; } ans = (ans + mod) % mod ; printf("%lld\n" , ans) ;}int main(){ scanf("%d" , &n) ; memset(cnt , 0 , sizeof(cnt)) ; memset(num , 0 , sizeof(num)) ; for(int i = 1 ; i <= n ; i ++) { int x ; scanf("%d" , &x) ; cnt[x] ++ ; } get_mu() ; init() ; solve() ; return 0 ;}

 

转载地址:http://afml.baihongyu.com/

你可能感兴趣的文章
多位水仙花数-python(出现运行超时?不妨用减法计算)
查看>>
地下迷宫探索(后两个测试点无法通过?这里有你想要的答案)
查看>>
城市间紧急救援(dijkstra算法)
查看>>
关键活动(注释超详细!!!)
查看>>
小白看完都会了!阿里云大师深入拆解Java虚拟机,看完这一篇你就懂了
查看>>
【IT之路】FAQ-Hibernate报错:表不存在
查看>>
【2020阿里云博客部署实战】如何远程连接和管理控制台基本介绍
查看>>
C程序举例:利用数组
查看>>
VBA之正则表达式(19)-- 相对引用转绝对引用
查看>>
巧用VBA统一数字单位
查看>>
Transpose实现数组行列转置的限制
查看>>
VBA中数组72变(随心所欲复制)
查看>>
[Golang]golang中自动锁的实现
查看>>
用float/double作为中转类型的“雷区”
查看>>
golang中interface的一些语法缺陷的改进
查看>>
vue-router路由 学习笔记
查看>>
数据结构与算法之栈
查看>>
数据结构大作业--迷宫问题
查看>>
【数据库】第七章课后题
查看>>
第四章 串、数组和广义表 —— BF算法和KMP算法
查看>>