题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6053

题意: 给出一个含 n 个元素的 a 数组, 求 bi <= ai 且 gcd(b1, ..., bn) >= 2 的 b 数组的数目;

思路: 首先想到的方法是枚举 gcd, 对于每个 gcd x 的情况, 将所有 bi / x 连乘, 然后将所有 gcd 的情况累加一下就能的到答案了 .

然而其时间复杂度为 O(t * min(a) * n), 铁定 tle;

对于后面连乘部分是可以优化一下的 . 把 a 数组元素装到一个桶里面, 然后枚举 gcd 时按照 ai / gcd 的值分下块,

对于区间 [gcd * k, gcd * (k + 1 ) - 1], 显然区间内的值除 gcd 的商都为 k, 若 a 中有 cnt 个元素处于该区间, 那么该块内的 b 数组元素有 k^cnt 种选择方案,

再将不同块的方案数乘起来就是当前 gcd 对答案的贡献了 .

然而上面还会出现重复计算(个人感觉这个有点难理解):

对于不能分解成不同素数乘积形式的 gcd, 在第一次计算其中多次出现的素因子作 gcd 时已经计算过了, 所以不累加到答案上 .

对于能分解成不同素数乘积形式的 gcd, 其中重复计算的我们可以用容斥去重, 奇加偶减 .

可以发现这和 moblus 函数很相近, 对与不能分解成不同素数乘积形式的数, 其 mu 值为 0, 对于能分解成不同素数乘积形式的数, 若其长度为奇数, mu 值为 -1, 长度为偶数则 mu 值为 1, 恰好与容斥的奇加偶减相反, 所以给 mu 加个负号即可 .

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
using namespace std; const int mod = 1e9 + ;
const int MAXN = 1e5 + ; bool check[MAXN];
int prime[MAXN], mu[MAXN], vis[MAXN << ]; void Moblus(void){
memset(check, false, sizeof(check));
int tot = ;
mu[] = ;
for(int i = ; i < MAXN; i++){
if(!check[i]){
prime[tot++] = i;
mu[i] = -;
}
for(int j = ; j < tot && i * prime[j] < MAXN; j++){
check[i * prime[j]] = true;
if(i % prime[j] == ){
mu[i * prime[j]] = ;
break;
}else mu[i * prime[j]] = -mu[i];
}
}
} ll get_pow(ll x, int n){
ll ans = ;
while(n){
if(n & ) ans = ans * x % mod;
x = x * x % mod;
n >>= ;
}
return ans;
} int main(void){
Moblus();
int t, n, x;
scanf("%d", &t);
for(int cas = ; cas <= t; cas++){
memset(vis, , sizeof(vis));
int mi = MAXN, mx = - MAXN;
scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%d", &x);
vis[x] += ;
mi = min(mi, x);
mx = max(mx, x);
}
for(int i = ; i < (MAXN << ); i++){//注意范围
vis[i] += vis[i - ];
}
ll ans = ;
for(int i = ; i <= mi; i++){
ll cnt = ;
if(mu[i]){
for(int j = i; j <= mx; j += i){
cnt = (cnt * get_pow((ll)(j / i), vis[j + i - ] - vis[j - ])) % mod;
}
}
ans = (ans - cnt * mu[i] + mod) % mod;
}
printf("Case #%d: %lld\n", cas, ans);
}
return ;
}

hdu6053(莫比乌斯+容斥+分块)的更多相关文章

  1. [中山市选2011][bzoj2440] 完全平方数 [二分+莫比乌斯容斥]

    题面 传送门 思路 新姿势get 莫比乌斯容斥 $\sum_{i=1}{n}\mu(i)f(i)$ 这个东西可以把所有没有平方质因子的东西表示出来,还能容斥掉重复的项 证明是根据莫比乌斯函数的定义,显 ...

  2. CF(439E - Devu and Birthday Celebration)莫比乌斯容斥

    题意:将n个糖果插入f-1个挡板分成f分(a1,a2,a3...af). 问有多少种分法能够使得gcd(a1,a2,a3...af)=1; 解法.莫比乌斯容斥,首先按1为单位分,这时候有C(n-1,f ...

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

  4. CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)

    Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...

  5. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

  6. BZOJ2440(全然平方数)二分+莫比乌斯容斥

    题意:全然平方数是指含有平方数因子的数.求第ki个非全然平方数. 解法:比較明显的二分,getsum(int middle)求1-middle有多少个非全然平方数,然后二分.求1-middle的非全然 ...

  7. CodeForces - 1097F:Alex and a TV Show (bitset & 莫比乌斯容斥)

    Alex decided to try his luck in TV shows. He once went to the quiz named "What's That Word?!&qu ...

  8. bzoj2440 [中山市选2011]完全平方数——莫比乌斯+容斥

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2440 莫比乌斯...被难倒... 看TJ:http://hzwer.com/4827.htm ...

  9. D - GCD HDU - 1695 -模板-莫比乌斯容斥

    D - GCD HDU - 1695 思路: 都 除以 k 后转化为  1-b/k    1-d/k中找互质的对数,但是需要去重一下  (x,y)  (y,x) 这种情况. 这种情况出现 x  ,y ...

随机推荐

  1. window.showModalDialog()之返回值

    window.showModalDialog的基本用法 showModalDialog() (IE 4+ 支持) showModelessDialog() (IE 5+ 支持) window.show ...

  2. mysql基本语句1

    操作MySQL数据库 向表中插入数据 insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: insert [into] 表名 [(列名1, 列名2, 列名3, ...)] ...

  3. guava_学习_00_资源帖

    一.精选 1.Google Guava 官方教程 二.参考资源 1.Google Guava官方教程(中文版) 2.使用Guava编写优雅代码 3.Google guava工具类的介绍和使用

  4. KVM-快照管理

    1.kvm克隆 kvm 虚拟机有两部分组成:img镜像文件和xml配置文件(/etc/libvirt/qemu 克隆命令:virt-clone -o rhel6- 71 -n xuegod63-kvm ...

  5. centos 静态拨号

    本人系统centos6.5:虚拟机太丑,固ssh. centos的与联网相关的配置文件在 $ /etc/sysconfig/network-scripts DHCP方式-联网 打开文件 $ vim / ...

  6. bzoj3224Treap

    Splay版本的会补... 在学了2个小时Splay之后深感Treap的优越 特地又花了20分钟打了个Treap 至于这些平衡树的优缺点 可以用平衡方式来直观的感受到 现在平衡树们面对着这样的一个问题 ...

  7. ASP.NET AJAX(Atlas)和Anthem.NET——管中窥豹般小小比较

    Anthem.NET近日有朋友和我提到Anthem.NET这个同样基于ASP.NET的Ajax框架,今天有机会亲自尝试了一下.初步的感觉似乎和ASP.NET AJAX不相上下,甚至某些地方要强于ASP ...

  8. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  9. POJ2559:Largest Rectangle in a Histogram

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:http://poj.org/problem?id=2559 贪心的想,最大的子矩阵顶部 ...

  10. puppet多环境配置(puppet自动化系列2)

    三.Puppet多环境部署 我们为puppetmaster建立3个环境,它们分别是开发环境(jqdev).测试环境(jqtest).生产环境(jqprd). 3.1 配置puppet.conf 在标签 ...