题目链接

题意

给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质。

思路

想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后再相乘就代表对于这个数有多少种。但是这样的想法会超时的还会算重复。

那么考虑分段计数,处理一个前缀和,代表sum[1~i]这段区间出现了多少个ai,然后对于每个因子都去枚举它的倍数,因为这段区间里面的数对于这个因子的贡献是相同的,于是可以有pow(倍数, sum[r] - sum[l-1])的贡献,这样的复杂度为nlognlogn。但是还有一个重要的问题,就是会算重复,例如当因子为2和4和6的情况。

这个时候就要用到莫比乌斯反演

我觉得莫比乌斯反演就是用在有约数关系时候的容斥原理。处理出来的表的时间复杂度是O(n)的。

比较常用的意义:

$ F(n) $ 表示约数为n的组数有多少。

$ f(n) $ 表示最大公约数为n的组数有多少。

\[F(n)=\sum_{d|n}f(d)
\]

d|n表示d为n的因子。

\[f(n)=\sum_{n|d}\mu(i)F(\frac{d}{i})
\]

一般我们求 $ f(1) $ 就是求gcd为1即互质的情况下的组数,这道题求的是不互质,即为 $ f(2) + f(3) + f(4) … + f(min(a)) $ 这个情况下要把 $ \mu(d) $ 乘个-1。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
typedef long long LL;
int vis[N], mu[N], prime[N], sum[N*2]; void mobius(int n) {
mu[1] = 1;
for(int i = 1; i <= n; i++) {
for(int j = 2 * i; j <= n; j += i) {
mu[j] -= mu[i];
}
}
memset(vis, 0, sizeof(vis));
mu[1] = 1; int cnt = 0;
for(int i = 2; i <= n; i++) {
if(!vis[i]) {
prime[cnt++] = i;
mu[i] = -1;
}
for(int j = 0; j < cnt && i * prime[j] <= n; j++) {
vis[i * prime[j]] = 1;
if(i % prime[j]) mu[i*prime[j]] = -mu[i];
else { mu[i*prime[j]] = 0; break; }
}
}
} LL f_pow(LL a, int b) {
LL ans = 1;
while(b) {
if(b & 1) ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
} return ans % MOD;
} int main() {
int t; scanf("%d", &t);
mobius(100000);
for(int cas = 1; cas <= t; cas++) {
int n; scanf("%d", &n);
memset(sum, 0, sizeof(sum));
int mi = N, ma = 0;
for(int i = 1; i <= n; i++) {
int a; scanf("%d", &a);
sum[a]++;
if(a < mi) mi = a;
if(a > ma) ma = a;
}
for(int i = 1; i < 2 * N; i++) sum[i] += sum[i-1];
LL ans = 0;
for(int i = 2; i <= mi; i++) {
LL tmp = 1, k = 1; for(int j = i; j <= ma; j += i, k++)
tmp = tmp * f_pow(k, sum[j+i-1] - sum[j-1]) % MOD; // 在j到j+i-1这段区间里面整除i的有k个数 ans = (ans - tmp * mu[i] + MOD) % MOD;
}
printf("Case #%d: %lld\n", cas, (ans + MOD) % MOD);
}
return 0;
}

HDU 6053:TrickGCD(莫比乌斯反演)的更多相关文章

  1. HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

    题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...

  2. HDU 6053 TrickGCD (莫比乌斯函数)

    题意:给一个序列A,要求构造序列B,使得 Bi <= Ai, gcd(Bi) > 1, 1 <= i <= n, 输出构造的方法数. 析:首先这个题直接暴力是不可能解决的,可以 ...

  3. HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2

    /* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...

  4. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  5. HDU 4746 Mophues (莫比乌斯反演应用)

    Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others) Total ...

  6. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  7. hdu 1695 GCD 莫比乌斯反演入门

    GCD 题意:输入5个数a,b,c,d,k;(a = c = 1, 0 < b,d,k <= 100000);问有多少对a <= p <= b, c <= q <= ...

  8. HDU 1695 GCD 莫比乌斯反演

    分析:简单的莫比乌斯反演 f[i]为k=i时的答案数 然后就很简单了 #include<iostream> #include<algorithm> #include<se ...

  9. HDU 5212 Code (莫比乌斯反演)

    题意:给定上一个数组,求 析: 其中,f(d)表示的是gcd==d的个数,然后用莫比乌斯反演即可求得,len[i]表示能整队 i 的个数,可以线性筛选得到, 代码如下: #pragma comment ...

  10. Mophues HDU - 4746 (莫比乌斯反演)

    Mophues \[ Time Limit: 10000 ms\quad Memory Limit: 262144 kB \] 题意 求出满足 \(gcd\left(a,b\right) = k\), ...

随机推荐

  1. 解决popup不随着window一起移动的问题

    原文:解决popup不随着window一起移动的问题 当我们设置Popup的StayOpen="True"时,会发现移动窗体或者改变窗体的Size的时候,Popup并不会跟随着一起 ...

  2. WPF编游戏系列 之四 用户控件

    原文:WPF编游戏系列 之四 用户控件        在上一篇<WPF编游戏系列 之三 物品清单>中,对物品清单进行了演示,其中反复用到了同一组控件(如下图),而且 颜昌钢也指出在3.2. ...

  3. centos搭建svn服务器并同步到web目录

    yum install subversion mkdir -v /root/svn cd /root/svn svnadmin create web cd web/conf/ vi passwd te ...

  4. 微信小程序把玩(二十七)audio组件

    原文:微信小程序把玩(二十七)audio组件 音频播放已经封装的很好!只需配合属性设置即可! (method和data配合使用) 主要属性: wxml <audio action="{ ...

  5. SQL SERVER中UPDLOCK ,READPAST使用

    原文:SQL SERVER中UPDLOCK ,READPAST使用 SQL SERVER中中获取不重复数据: select top 1 * from orders with(UPDLOCK ,READ ...

  6. LCID

    Language Location (or type) Language ID Language tag Supported version Afar   0x1000 aa Release 9 Af ...

  7. qt截获html请求(继承QNetworkAccessManager和QNetworkReply)

    QtWebkit加载html页面,html中会有很多的请求,比如<img id="testImg" src="http://*.jpg" width=&q ...

  8. c#实现类似数据的行锁

    当我们有一些这样的需求,比如某个订单中下单,修改等等这些是单例执行的,不能同步操作,当然这样的情况你可以使用数据库的行锁来实现,但是我们代码里面实现的话 ,我们也要用到锁,大部分情况下我们使用lock ...

  9. 【转】简单的jQuery插件开发方法

    在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用 ...

  10. 使用AnimateWindow来实现窗口淡入淡出(主要有四种动画,滚动,滑动,折叠或展开,和淡入淡出)

    如果是在VC6下进行编译,应引入下面的预编译宏,注意放在windows.h的前面#undef  WINVER   #define  WINVER   0x500为什么要引入上面的宏呢?看看winuse ...