http://acm.hdu.edu.cn/showproblem.php?pid=6053

题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)>=2的数组b的个数

题解:利用容斥定理。我们先定义一个集合f(x)表示gcd(b1,b2...bn)为x倍数的个数(x为质数),我们在定义一个数mi为数组中的最小值,那么集合{f(2)Uf(3)....f(n)}就是我们想要的答案。f(x)=(a1/x)*(a2/x)*.....(ai/x),直接累加肯定是有重复的,我们得用容斥定理筛一下,如果x是奇数个不同素数因子的乘积最后的结果要加上f(x);如果x为偶数个不同素数因子的乘积,最后的结果要减去f(x),其他情况贡献为0。是不是和莫比乌斯函数的情况正好相反?这里筛值的时候,用0(n)求到的莫比乌斯函数筛时间复杂度还是可以的。光这样还是不够,因为数组的长度为1e5,我们求f(x)的时候也得优化,怎么优化呢。我们把用一个权值数组把a[i]的值离散上去,为啥要用权值的形式存放a数组的值呢,我们把权值数组分成x段,每段的贡献由1开始递增到x(这段比较抽象,具体看下代码)

ac代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int mod=1e9+;
ll mu[];
int prime[],vis[];
ll a[],sum[];
// 比较大的数组还是定义在外面比较好
ll qpow(ll a,ll b)
{
ll f=;
while(b)
{
if(b%==) f=(f*a)%mod;
a=(a*a)%mod;
b/=;
}
return f;
} void init()
{
mu[]=;
memset(mu,,sizeof(mu));
memset(prime,,sizeof(prime));
memset(vis,,sizeof(vis));
int ret=;
for(int i=;i<;i++)
{
if(!vis[i])
{
prime[ret++]=i;
mu[i]=-1LL;
}
for(int j=; j<ret && i*prime[j] < ;j++)
{
int temp=i*prime[j];
vis[temp]=;
if(i%prime[j]) mu[temp]=-mu[i];
else
{
mu[temp]=;
break;
}
}
}
} int main()
{
int t;
scanf("%d",&t);
init(); int Case=;
while(t--)
{
ll n;
cin>>n;
ll mi=;
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
mi=min(a[i],mi);
sum[a[i]]++;
}
for(int i=;i<=;i++) sum[i]+=sum[i-];
ll zz=;
for(int i=;i<=mi;i++)
{
ll ans=;
if(mu[i]==) continue;
for(int j=;j*i<=;j++)// 平铺分段的思想 枚举贡献的思想吧,对于f(x)来说,x/n相同的值比较多,这样就可以把问题的规模变小 这个思维比较常见
{
ans=(ans*qpow(j,sum[i*(j+)-]-sum[j*i-])%mod)%mod;
}
zz=(zz-mu[i]*ans%mod+mod)%mod;// ! 取模的时候 如果有减法 要注意
}
printf("Case #%d: ",++Case);
cout<<zz<<endl;
}
return ;
}

hdu 6053 trick gcd 容斥的更多相关文章

  1. hdu 6053 TrickGCD(筛法+容斥)

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. HDU 1695 GCD 容斥

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

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

  4. HDU 5656 CA Loves GCD (容斥)

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

  5. C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥

    C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ...

  6. 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)

    题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...

  7. HDU 5297 Y sequence 容斥 迭代

    Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...

  8. LightOJ 1161 - Extreme GCD 容斥

    题意:给你n个数[4,10000],问在其中任意选四个其GCD值为1的情况有几种. 思路:GCD为1的情况很简单 即各个数没有相同的质因数,所以求所有出现过的质因数次数再容斥一下-- 很可惜是错的,因 ...

  9. HDU 4609 3-idiots FFT+容斥

    一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...

随机推荐

  1. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  2. mysql 优化知识点

    附录: https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0 本文概要 概述 为什么要优化 ...

  3. Chrome浏览器报错:ERR_UNSAFE_PORT

    今天用Chrome浏览器打开一个页面发现报错了:ERR_UNSAFE_PORT. 所以,去搜了一下发现Chrome浏览器是默认一些端口号为非安全端口的. 遇到这个问题建议更换端口号或者更换浏览器打开. ...

  4. 初学Linux之标准I/O和管道

    标准输入和输出 程序是由指令+数据组成 程序的数据流有三种: 输入数据流:<–标准输入(stdin),一般默认是键盘 输出数据流:–>标准输出(stdout),一般默认到终端窗口 错误输出 ...

  5. APP界面架构设计

    作为PM,信息架构和页面流的设计想必烂熟于心,当确定好产品战略层和范围层即为何种目标用户提供何种服务后,就要着手搭建功能架构,将目标功能通过良好的用户体验传递给用户,目的是高效解决用户痛点,从而实现价 ...

  6. shell中的for循环用法详解

    for i in “file1” “file2” “file3”for i in /boot/*for i in /etc/*.conffor i in $(seq -w 10) –>等宽的01 ...

  7. CentOS 7.4 发布下载,安全稳定的Linux发行版

    CentOS 7.4 发布了.CentOS 是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在 RHEL 的基础上修正了不少已知的 Bug ,相对于其他 Lin ...

  8. Android中实现日期时间选择器(DatePicker和TimePicker)

    利用Android应用框架提供的DatePicker(日期选择器)和TimePicker(时间选择器),实现日期时间选择器. Dialog的Content布局文件(date_time_dialog.x ...

  9. 11 Flutter仿京东商城项目 商品列表页面二级筛选导航布局

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  10. PowerDesigner常用命令

    在Tools=>Execute Commands下的Edit/Run Scripts,或者通过Ctrl+Shift+X就可以运行脚本.如图: 1.将所有的表名和列名都修改为大写 '******* ...