Link:http://codeforces.com/contest/803/problem/F

题意:给n个数字,求有多少个GCD为1的子序列。

题解:容斥!比赛时能写出来真是炒鸡开森啊!

num[i]: 有多少个数字是 i 的倍数。

所有元素都是1的倍数的序列有:$2^n-1$个。先把$2^n-1$设为答案

所有元素都是质数的倍数的序列有:$\sum 2^{num[p_1]} - 1$个,这些序列不存在的,得从答案中减去。

所有元素都是两质数之积的倍数的序列有:$\sum 2^{num[p_1*p_2]} - 1$个,这些序列两次扫黄都在现

场,我们应减一次,但实际减了两次,多减了一次,所以要加回到答案中。

然后考虑,所有元素都是3,4,5......个质数之积的倍数的序列。

依次类推。于是就可以容斥了。

PS: 要先预处理好一个数字,能被拆成几个素数之积。而且同一个素数不能出现两次或以上。

【不优雅の】code:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int MAXN = 100000+10;
const int MAXM = 100000+10;
ll prime[MAXN+1];
ll ct[MAXN], sgn[MAXN];
ll n, a[MAXN], bad[MAXN];
void getPrim()
{
memset(sgn, 1, sizeof(sgn));
memset(prime, 0, sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i]){
prime[++prime[0]] = i;
}
for(int j=1;(j<=prime[0])&&(prime[j]<=(MAXN/i));j++)
{
prime[prime[j]*i] = 1;
if(i%prime[j]==0) break;
}
}
} void getFactor(ll x)
{
ll cnt = 0, i;
ll tmp = x;
for(i = 1; prime[i] * prime[i] <=tmp ;i++)
{
if(tmp % prime[i] == 0)
{
int c = 0;
while(tmp % prime[i] == 0)
{
c ++;
tmp /= prime[i];
}
if(c >= 2)
{
bad[x] = 1;
return;
}
cnt ++;
}
}
if(tmp!=1)
{
cnt ++;
}
ct[x] = cnt;
} const ll MOD = 1000000007;
ll mpow(ll a, ll n)
{
ll ret = 1;
while(n)
{
if(n & 1)
{
ret = (ret * a);
ret %= MOD;
}
a = a * a % MOD;
n >>= 1;
}
return ret;
} ll num[MAXN];
int main()
{
getPrim();
for(int i=1;i<MAXN;i++)
{
getFactor(i);
}
scanf("%lld", &n);
for(int i=1;i<=n;i++)
{
scanf("%lld", &a[i]);
for(ll j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
if(j*j!=a[i]) num[a[i]/j] ++;
num[j] ++;
}
}
}
ll ans = 0;
for(int i=2;i<MAXN;i++)
{
if(num[i]>0 && ct[i]>0 && !bad[i])
{
//cout << i << " " << num[i] << " " << ct[i] << endl;
ans += (ll)( (ct[i]%2==1)?(1):(-1) ) * (mpow(2, num[i])-1);
ans %= MOD;
}
}
ans = (mpow(2, n) - ans + MOD) % MOD;
cout << (ans-1+MOD)%MOD << endl;
}

官方题解提到了莫比乌斯函数,最终答案的表示为$\sum\limits_{i=1}^{1e5} µ(i)(2^{num[i]}-1)$

套了下KuangBin巨巨的模板。重写了遍。

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int NICO = 100000+2;
const int MOD = 1000000000 + 7;
LL n, a[NICO], cnt[NICO], po[NICO], mo[NICO];
bool chk[NICO];int prime[NICO];
void init()
{
po[0] = 1, mo[1] = 1;
for(int i=1;i<NICO;i++) po[i] = 2*po[i-1]%MOD;
memset(chk, 0, sizeof(chk));
int tot = 0;
for(int i=2;i<NICO;i++)
{
if(!chk[i])
{
prime[tot++] = i;
mo[i] = -1;
}
for(int j=0;j<tot;j++)
{
if(i*prime[j]>=NICO) break;
chk[i*prime[j]] = 1;
if(i%prime[j] == 0)
{
mo[i*prime[j]] = 0;
break;
} else {
mo[i*prime[j]] = -mo[i];
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j*j<=a[i];j++)
{
if(a[i]%j) continue;
if(j*j != a[i]) cnt[a[i]/j] ++;
cnt[j] ++;
}
}
} int main()
{
scanf("%lld", &n);
for(int i=1;i<=n;i++) scanf("%lld", &a[i]);
LL ans = 0; init();
for(int i=1;i<NICO;i++)
{
ans = (ans + mo[i] * (po[cnt[i]]-1) )% MOD;
}
cout << (ans+1000LL*MOD)%MOD << endl;
}

  

Codeforces 803F Coprime Subsequences (容斥)的更多相关文章

  1. Codeforces 803F - Coprime Subsequences(数论)

    原题链接:http://codeforces.com/contest/803/problem/F 题意:若gcd(a1, a2, a3,...,an)=1则认为这n个数是互质的.求集合a中,元素互质的 ...

  2. CodeForces 803F Coprime Subsequences

    $dp$. 记$dp[i]$表示$gcd$为$i$的倍数的子序列的方案数.然后倒着推一遍减去倍数的方案数就可以得到想要的答案了. #include <iostream> #include ...

  3. Codeforces 100548F - Color (组合数+容斥)

    题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...

  4. HDU 4135 Co-prime(容斥+数论)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. HDU 4135:Co-prime(容斥+二进制拆分)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. 题解报告:hdu 4135 Co-prime(容斥定理入门)

    Problem Description Given a number N, you are asked to count the number of integers between A and B ...

  7. HDU 4135 Co-prime(容斥:二进制解法)题解

    题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...

  8. Codeforces 920G(二分+容斥)

    题意: 定义F(x,p)表示的是一个数列{y},其中gcd(y,p)=1且y>x 给出x,p,k,求出F(x,p)的第k项 x,p,k<=10^6 分析: 很容易想到先二分,再做差 然后问 ...

  9. Hdu 5072 Coprime(容斥+同色三角形)

    原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...

随机推荐

  1. C#生成漂亮验证码完整代码类

    using System;using System.Web;using System.Drawing;using System.Security.Cryptography; namespace Dot ...

  2. iOS 如何保持线程一直在运转(二)

    一.接着上一篇通过NSThread可以方便的创建一个线程,并且启动线程的Runloop,在线程体中执行一个while循环 然后我们就可以方便得利用这个线程了 - (void)threadRun:(NS ...

  3. 初识 Javascript.01 -- Javascript基础|输出方式、变量、变量命名规范、数据类型、

    Javascript基础 1 聊聊Javascript 1.1 Javascript的历史来源 94年网景公司   研发出世界上第一款浏览器. 95年 sun公司   java语言诞生 网景公司和su ...

  4. 维护Study

    ##老师发了一个study来让我们纠错维护,整个软件是日程管理系统,分为欢迎界面,登录 注册界面,提醒界面添加日程界面,还有个人中心等.一些主要代码老师让我们把缺失部分去维护.首先我们读一下主要代码# ...

  5. 【JavaWeb】Session(转)

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自 ...

  6. Selenium测试专项三班隆重开班

    Selenium测试专项三班隆重开班 应广大测试技术人员要求,以及企业技术需求.Selenium提前一周开课了,只针对合作的每家企业提供1-2个参训名额.预计培训60人次.但报名人数却远远超出我们预期 ...

  7. 2.XML高级用法

    XML命名空间提供了避免元素命名冲突的方法.而XML CDATA允许我们在XML中添加不被XML解析器解析的数据. 2.1 XML命名空间 一般情况下,我们编写的XML文档都是: XML文档1: &l ...

  8. stm32串口通讯问题

    stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...

  9. iOS标注和适配

    很多项目一开始没有注意美术素材的规范,这在后期会引起混乱.假如有机会做一个新项目(旧项目会有自己的历史问题,一下子很难改过来),建议设计师和程序员一起坐下来.共同设立一套规范,之后共同遵守. 下面说说 ...

  10. 手把手视频:万能开源Hawk抓取动态网站

    Hawk是沙漠之鹰历时五年开发的开源免费网页抓取工具(爬虫),无需编程,全部可视化. 自从上次发布Hawk 2.0过了小半年,可是还是有不少朋友通过邮件或者微信的方式询问如何使用.看文档还是不如视频教 ...